嵌套循环使用元组键python的字典中的元组值

时间:2013-08-05 11:28:56

标签: python dictionary tuples defaultdict

我有一个defaultdict,其中键是一个4元组(gene_region,种类,本体,长度)。

循环使用很简单:

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:
        ...

2 个答案:

答案 0 :(得分:5)

您必须将所有各种关键元素收集到列表中,然后循环遍历这些元素(最好使用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()生成相同的组合序列,就像嵌套循环一样。

答案 1 :(得分: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