Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何遍历列表字典,并将每次迭代与所有键中的一个项配对?_Python_Dictionary_Recursiveiterator - Fatal编程技术网

Python 如何遍历列表字典,并将每次迭代与所有键中的一个项配对?

Python 如何遍历列表字典,并将每次迭代与所有键中的一个项配对?,python,dictionary,recursiveiterator,Python,Dictionary,Recursiveiterator,我需要遍历一个列表字典,不知道字典将有多少个列表,但仍然将每个列表值与字典中另一个键(如果存在另一个键)生成的任何其他列表值配对。我有以下代码: def loop_rec(codes, currentcode={}): if len(codes.keys())>1: for key in sorted(codes): codespop = dict(codes) loop = codespop.pop(key)

我需要遍历一个列表字典,不知道字典将有多少个列表,但仍然将每个列表值与字典中另一个键(如果存在另一个键)生成的任何其他列表值配对。我有以下代码:

def loop_rec(codes, currentcode={}):
    if len(codes.keys())>1:
        for key in sorted(codes):
            codespop = dict(codes)
            loop = codespop.pop(key)
            for x in loop:
                currentcode[key]=x
                loop_rec(codespop,currentcode)
            break
    else:
        for key in codes.keys():
            loop = codes[key]
            for x in loop:
                currentcode[key]=x
                print currentcode
因此,如果我有以下词典:

codes = {"coarse":range(4),"fine":range(2)}
我得到这个结果:

>>> loop_rec(codes)
{'fine': 0, 'coarse': 0}
{'fine': 1, 'coarse': 0}
{'fine': 0, 'coarse': 1}
{'fine': 1, 'coarse': 1}
{'fine': 0, 'coarse': 2}
{'fine': 1, 'coarse': 2}
{'fine': 0, 'coarse': 3}
{'fine': 1, 'coarse': 3}
这是一个蛮力的方法,并希望有一个更“Pythonic”的方式这样做。我搜索了很多类似的东西,但是大多数方法并没有在每次迭代中把粗值和细值放在一起。也希望它先通过粗略循环,但sorted命令不起作用


编辑:刚刚意识到排序命令正在工作,打印输出只是没有排序。我不在乎它是否按顺序打印。

如果我正确理解了您的问题,您需要所有列表的笛卡尔乘积,这些列表是dict的值。您可以使用
itertools.product
来完成这一点

import itertools
def dict_product(d):
    list_of_dicts = []
    for values in itertools.product(*d.values()):
        item = dict(zip(d.keys(),values))
        list_of_dicts.append(item)
    return list_of_dicts


codes = {"coarse":range(4),"fine":range(2),"zesty":range(3)}
for item in dict_product(codes):
    print(item)
结果:

{'zesty': 0, 'fine': 0, 'coarse': 0}
{'zesty': 0, 'fine': 0, 'coarse': 1}
{'zesty': 0, 'fine': 0, 'coarse': 2}
{'zesty': 0, 'fine': 0, 'coarse': 3}
{'zesty': 0, 'fine': 1, 'coarse': 0}
{'zesty': 0, 'fine': 1, 'coarse': 1}
{'zesty': 0, 'fine': 1, 'coarse': 2}
{'zesty': 0, 'fine': 1, 'coarse': 3}
{'zesty': 1, 'fine': 0, 'coarse': 0}
{'zesty': 1, 'fine': 0, 'coarse': 1}
{'zesty': 1, 'fine': 0, 'coarse': 2}
{'zesty': 1, 'fine': 0, 'coarse': 3}
{'zesty': 1, 'fine': 1, 'coarse': 0}
{'zesty': 1, 'fine': 1, 'coarse': 1}
{'zesty': 1, 'fine': 1, 'coarse': 2}
{'zesty': 1, 'fine': 1, 'coarse': 3}
{'zesty': 2, 'fine': 0, 'coarse': 0}
{'zesty': 2, 'fine': 0, 'coarse': 1}
{'zesty': 2, 'fine': 0, 'coarse': 2}
{'zesty': 2, 'fine': 0, 'coarse': 3}
{'zesty': 2, 'fine': 1, 'coarse': 0}
{'zesty': 2, 'fine': 1, 'coarse': 1}
{'zesty': 2, 'fine': 1, 'coarse': 2}
{'zesty': 2, 'fine': 1, 'coarse': 3}

在本例中,迭代顺序为粗-细,但不能保证这种行为。在CPython 3.6及更高版本中,字典是有序的,但这是一个实现细节,将来可能会发生变化。

我认为这与您的问题没有直接关系,但请小心使用字典作为默认参数,因为当您多次调用函数时,它可能会有令人惊讶的行为。相关阅读:@Kevin:我正努力做到这一点。这就是为什么要制作字典的副本,并确保原始字典不会因为原始调用而被修改。我将使用:item=dict(zip(排序(代码),值)),在精细之前先粗略再迭代。