質問

I am new to python, so correct me if this is not the best/fastest way of doing this. I have created a dictionary with multiple values assigned to each key. In codonDict I have included only 1 key with a few of its values (there will be a lot more). Now I have a file which I have called calls here. What I want to do is find the key that corresponds to the #CHROM in the file and then search through the keys values to see if it contains the corresponding POS.

codonDict = defaultdict(<type 'list'>, {'HE667775': [106690, 106692, 106694, 106696, 106698, 106700, 106702, 106704, 106706, 106708, 106710, 106712, 106714, 106716, 106718, 106720, 106722, 106724, 106726, 106728, 106730, 106732, 106734, 106736, 106738, 106740, 106742, 106744, 106746, 106748, 106750, 106752, 106754, 106756, 106758, 106760, 106762, 106764, 106766, 106768, 106770, 106772, 106774, 106776, 106778, 106780, 106782, 106784, 106786, 106788, 106790, 106792, 106794, 106796, 106798, 106800, 106802, 106804, 106806, 106808, 106810, 106812, 106814, 106816, 106818, 106820, 106822, 106824, 106826, 106828, 106830, 106832, 106834, 106836]})

calls file:

#CHROM      POS
HE667775    106824  
HE667775    24

So from this sample data the desired output would be that HE667775 106824 which gets append to test

What I have tried:

    test = []
    line = calls.readline()

    while len(line) > 1:
    #for line in calls:
        objects = line.split()

        pos = int(objects[1])
        chrom = objects[0]

        #if scaf in codonDict and pos associated with that key

            for scaf, position in codonDict.itervalues():
            if pos == position and chrom in scaf:
                test.append(line)

        print test

Error:

ValueError: too many values to unpack

Edit: This is the complete error traceback, however the lines differ, so line 28 in the above code would be I believe pos = int(objects[1])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 28, in main
ValueError: too many values to unpack
役に立ちましたか?

解決

To check if the pos from your file is in the condonDict no loop is required, you can use python in to check for membership by:

pos in condonDict[chrom]

他のヒント

So i don' t know exactly what your code is doing I' m pretty sure you get the ValueError because of this line of code:

for scaf, position in codonDict.itervalues()

itervalues gives you an iterator over the values of your dictionary. In your case this is a list. But you can' t unpack two variables scaf and position.

Try it this way and there should be no ValueError anymore:

for val in codonDict.itervalues()

To check if chrom is in codonDict just use in like dm03514 wrote before. I could imagine something like this with codonDict as an ordinary dictionary:

def find(chrom, pos):
    if chrom in codonDict:
        values = codonDict[chrom]
        if pos in values:
            print "%i in %s" % (pos, chrom)
        else:
            print "%i not in %s" % (pos, chrom)
    else:
        print "chrom %s not found" % chrom
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top