【问题标题】:Parsing through a dictionary of tuples通过元组字典解析
【发布时间】:2015-08-08 03:46:58
【问题描述】:

通过使用迭代和推导,我创建了一个 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': []}

当“长度”最大时,我想遍历这本字典以获得“起点”。在我的例子中,我应该得到的答案是

起点 1(在 seq1 中),因为它在所有条目中具有最大的 长度值 (12)

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

【问题讨论】:

标签: python dictionary tuples


【解决方案1】:

您也可以使用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]

【讨论】:

  • 谢谢。我曾尝试嵌套 for 循环并迷失在语法中。
  • 很高兴能为您提供帮助。我想建议您通过单击答案左侧的勾号来接受答案(对您最有帮助,您最喜欢),这将对社区有所帮助。
  • 您可能希望使用itervalues 而不是values 来减少内存占用:values 创建一个字典值的副本,而itervalues 没有。
【解决方案2】:

这段代码应该可以。

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

【讨论】:

  • 谢谢!很好的迭代虽然是一个列表字典。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2016-01-10
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多