2017-09-08 32 views
3

我需要遍歷列表字典,不知道字典將具有多少列表,但仍然將每個列表值與字典中另一個鍵(如果存在另一個鍵)生成的任何其他列表值進行配對。我有以下代碼:如何遍歷列表字典並將每次迭代與所有鍵中的項目進行配對?

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」這樣做的方式。我搜索了大量相同的東西,但大多數方法不會導致每次迭代的粗略值和精確值在一起。也寧願它首先粗略循環,但排序的命令不起作用。

編輯:剛纔意識到排序的命令正在工作,打印只是不排序。我不在乎它是否按順序打印。

+2

我不認爲這與您的問題直接相關,但要小心使用字典作爲默認參數,因爲當您多次調用該函數時,它可能會有令人驚訝的行爲。相關閱讀:[「最小的驚訝」和可變的默認參數](https://stackoverflow.com/q/1132941/953482) – Kevin

+0

@凱文:我想成爲。這就是爲什麼要製作字典的副本,並確保原始字典不會因原始調用而被修改。 –

回答

2

如果我正確理解你的問題,你想採取所有列表的字典產品的字典值。您可以使用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及更高版本中,字典是有序的,但這是實現細節,將來可能會更改。

+0

我打算使用:item = dict(zip(sorted(codes),values))來粗略地在迭代之前進行迭代。 –

相關問題