通过元组字典解析

Parsing through a dictionary of tuples

通过使用迭代和理解,我创建了一个 python 字典来存储与值关联的键(与某些功能相关的统计信息)。键指的是一个唯一的 ID(在我的例子中是一个基因)。我通过元组列表填充了值,每个元组指示特征的 startpointlength(在本例中, 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': []}

我想遍历此字典以在 "length" 最大时获取 "startpoint"。在我的示例中,我应该得到的答案是

startpoint 1 (in seq1), because it has biggest length value (12) among all the entries.

我发现很难遍历多个元组。

这段代码应该可以。

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

您还可以使用 itertools.chain.from_iterable ,将 dict.values() (字典中所有值的列表)传递给它。然后将 max 与 key 参数一起使用,以在第二个索引( 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]

这是我的方法:创建一个元组列表 (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'