【问题标题】:Nested looping over tuple values in a dictionary with tuple keys python使用元组键python在字典中嵌套循环元组值
【发布时间】:2013-08-06 02:15:12
【问题描述】:

我有一个默认字典,其中键是 4 元组(基因区域、物种、本体、长度)。

循环很简单:

for gene_region, species, ontology, length in result_dict:

但是,我想以嵌套方式对其进行迭代,如下所示:

for gene_region
    for species
        for ontology
            ...

我该怎么做?除了首先收集价值之外没有其他方法吗?或者使用下面的dum-dum方式:

for gene_region, _, _, _ in result_dict:
    for _, species, _, _ in result_dict:
        ...

【问题讨论】:

  • 你希望用循环做什么?创建 4 个值的乘积? gen_region 等值究竟是什么?列表、字符串、整数?
  • 键都是字符串,dict中的值只是我要比较的数字。
  • 但是你有元组作为键,你希望循环循环什么。 gen_region 的所有可能值?如果不首先列出所有键,将元组的各个元素收集到单独的结构中,然后循环遍历它们,您就无法做到这一点。然后你需要从中重建密钥..
  • 把它写下来作为答案,我会接受的(如果没有其他人有任何更聪明的想法。)

标签: python dictionary tuples defaultdict


【解决方案1】:

您必须将所有各种关键元素收集到列表中,然后遍历这些列表(最好使用itertools.product())。收集可以通过zip()

from itertools import product

gene_regions, species_plural, ontologies, lengths = zip(*result_dict)

for gene_region, species, ontology, length in product(gene_regions, species_plural, ontologies, lengths):
    # do something with this combo.

product() 产生与嵌套循环相同的组合序列。

【讨论】:

    【解决方案2】:

    我认为您可以考虑将数据重新创建为嵌套字典:

    >>> result_dict = {}
    >>> result_dict[(1, 2, 3, 4)] = "test"
    >>> result_dict[(1, 2, 4, 4)] = "test2"
    >>> result_dict
    {(1, 2, 3, 4): 'test', (1, 2, 4, 4): 'test2'}
    
    >>> result_dict2 = {}
    >>> for (a, b, c, d), k in result_dict.iteritems():
    ...     result_dict2.setdefault(a, {}).setdefault(b, {}).setdefault(c, {})[d] = k
    ... 
    >>> result_dict2
    {1: {2: {3: {4: 'test'}, 4: {4: 'test2'}}}}
    

    然后您可以在任何级别上迭代键:

    for _, a in result_dict2.iteritems():
        for _, b in a.iteritems():
            for _, c in b.iteritems():
                for _, d in c.iteritems():
                    # do something
    

    【讨论】:

    • 您可以在这里使用reduce 使您的循环更加健壮:例如....for k, v in result_dict.iteritems(): reduce(lambda a, b: a.setdefault(b, {}), k[:-1], result_dict2)[k[-1]] = v
    • nice :) 我实际上并不喜欢这个长长的 setdefault 链,但没想过以这种方式减少它们
    猜你喜欢
    • 2019-11-14
    • 2011-11-01
    • 2019-01-11
    • 2017-05-19
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多