2014-02-08 1 views
1

Я новичок в python, поэтому исправьте меня, если это не лучший/самый быстрый способ сделать это. Я создал словарь с несколькими значениями, назначенными каждому ключу. В codonDict Я включил только 1 ключ с несколькими его значениями (будет намного больше). Теперь у меня есть файл, который я назвал здесь calls. Я хочу найти ключ, который соответствует #CHROM в файле, а затем выполнить поиск по значениям ключей, чтобы увидеть, содержит ли он соответствующий POS.Ключи поиска и его значения с использованием defaultdict

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 файл:

#CHROM  POS 
HE667775 106824 
HE667775 24 

Таким образом, с этой выборки данных желаемый результат будет то, что HE667775 106824, который получает append к test

То, что я пробовал:

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 

Ошибка:

ValueError: too many values to unpack 

Edit: Это полная отслеживающий ошибки, однако линии различаются, поэтому строка 28 в приведенном выше коде будет я считаю, 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 
+0

Не могли бы вы показать полную трассировку стека ошибок? – thefourtheye

+0

@ crysis405: вы все еще получаете ошибку теперь, когда вы изменили 'itervalues' на' iteritems'? – superjump

ответ

2

Чтобы проверить, если pos от вашего файл находится в condonDict, петля не требуется, вы можете использовать python in, чтобы проверить его на членство:

pos in condonDict[chrom]

+0

Изменение значений элементов, избавленных от ошибки, но как я могу выйти из цикла while? Прямо сейчас его просто 'print' forever – crysis405

+0

Работает как шарм, спасибо – crysis405

2

Так я не 'т точно знать, что ваш код делает я довольно уверен, что вы получите ValueError из-за этой строки кода:

for scaf, position in codonDict.itervalues() 

itervalues дает вам итератор значений вашего Словарь. В вашем случае это список. Но вы не можете распаковать две переменные scaf and position.

Попробуй так и там больше не должно быть ValueError:

for val in codonDict.itervalues() 
+0

Как бы я затем проверить, соответствует ли ключ' # CHROM', а затем, если этот ключ содержит 'POS'? – crysis405

0

Чтобы проверить, хром в codonDict просто использовать in как dm03514 писал раньше. Я мог представить что-то подобное с codonDict в качестве обычного словаря:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^