通过使用迭代和理解,我创建了一个python字典,用于存储与值相关的键(与某些特征相关的统计数据)。键,指的是一个唯一的ID(在我的例子中,是一个基因)。我已经通过一个元组列表填充了值,每个元组都表示一个特征的起始点和长度(在这种情况下, ORF 或其他基因ID的潜在蛋白质编码序列)。任何给定的基因都可以有许多这样的特征一般形式如下:
{key1:[(startpoint1,length1)], key2[(startpoint1,length1)(startpoint2,length2)...], key3[]}
如下所示(在示例字典中),某些键可能只有一个功能(只有一个元组对),而其他键可能有多达100个或更多。为简单起见,我已经展示了3对seq1。也可以有没有功能的键,例如seq3和4。
{'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}
我希望迭代这个字典,以便在“长度”最大时获得“起始点”。在我的例子中,我应该得到的答案是
startpoint 1 (在seq1中),因为它在所有条目中的最大长度值(12)。
我发现很难迭代多个元组。
答案 0 :(得分: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
答案 1 :(得分:1)
您还可以使用itertools.chain.from_iterable
,将dict.values()
(字典中的所有值列表)传递给它。然后使用带有键参数的max
来获取第二个索引(1-index)处最大值的元组,示例 -
>>> 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]
答案 2 :(得分: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'