2015-08-08 10 views
0

С помощью итераций и понятий я создал словарь python, в котором хранятся ключи, связанные со значениями (статистика, связанная с определенными функциями). Ключи относятся к уникальному идентификатору (в моем случае, к генам). Я заселена значения списком кортежей каждый из которых указывает на StartPoint и длину конструктивного элемента (в данном случае, ORF или другими словами потенциального белка кодирования последовательности) гена ID. Любой данный ген может иметь много таких признаков. Общий вид, как в соответствии:Прохождение через словарь кортежей

{key1:[(startpoint1,length1)], key2[(startpoint1,length1)(startpoint2,length2)...], key3[]} 

Как показано ниже (в словаре образца), некоторые клавиши могут иметь только одну функцию (только один кортеж, пара), в то время как другие могут иметь столько, сколько 100 или больше. Для простоты я показал seq1 с 3 парами. Также может быть ключи без каких-либо признаков, например, seq3 и 4.

{'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}

Я хочу перебирать этот словарь, чтобы получить «начальный», когда «длина» максимальна. В моем примере ответ я получаю

кузницы кадров 1 (в Seq1), потому что он имеет самое большое значение длины (12) среди всех записей.

Мне сложно проходить через несколько кортежей.

+0

Что вы нашли в итерации по нескольким кортежам? Вы сталкиваетесь с какой-либо проблемой при любых попытках? Если это так, сообщите об этом, а также о проблеме, с которой вы столкнулись. –

+0

related: http://stackoverflow.com/questions/5098580/implementing-argmax-in-python также обратите внимание, что [max может принимать итеративную и настраиваемую функцию] (https://docs.python.org/2/library/functions.html#max) – Paul

ответ

1

Вы также можете использовать itertools.chain.from_iterable, передавая ему dict.values() (список всех значений в словаре). А затем использовать max с основным аргументом в пользу того, чтобы вернуть кортеж с максимальными значениями во втором индексе (1-индекс), пример -

>>> from itertools import chain 
>>> d = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []} 
>>> max(chain.from_iterable(d.values()),key=lambda x: x[1]) 
(1, 12) 

itertools.chain.from_iterable, принимает итерацию он получает в качестве входных данных и цепей каждый вверх в один список, пример -

>>> l = [(1,2),(3,4)] 
>>> list(chain.from_iterable(l)) 
[1, 2, 3, 4] 
+0

Спасибо за это. Я пробовал, вложенные в петли и теряясь в синтаксисе. –

+0

Рад, что мне было полезно. Я хотел бы посоветовать вам принять ответ (в зависимости от того, что вам больше всего понравилось больше всего), нажав на отметку слева от этого ответа, это было бы полезно для сообщества. –

+0

Возможно, вы захотите использовать 'itervalues' вместо' values', чтобы уменьшить печать стопы памяти: 'values' создают копию значений словаря, тогда как' itervalues' не делает. –

1

Этот фрагмент кода должен делать.

myDict = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []} 

maxLength = 0; 
maxStartingPoint = 0; 
maxSeq = "" 

for sequence in myDict: 

    for key,value in myDict[sequence]: 
     if value > maxLength: 
      maxLength = value 
      maxStartingPoint = key 
      maxSeq = sequence 
+0

Спасибо! Хорошая итерация, хотя словарь списков. –

0

Вот мой подход: создать список кортежей (length, start_point, key), таким образом, функция max может просто выбрать кортеж с максимальной длиной.

def maxlen(seq): 
    longest = max((length, start_point, key) for key, value in seq.iteritems() for start_point, length in value) 
    return longest 

# Test 
seq = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []} 
length, start_point, key = maxlen(seq) # 12, 1, 'seq1'