2013-08-23 18 views
0

我的默認詞典列表:如何使以多種方式改變一些違約形成一個列表

default = [{"One": 1, "Two": 2, "Three": 3}, {"One": 5, "Two": 6, "Three": 7}, 
{"One": 9, "Two": 10, "Three" : 11}] 

所有使用相同的按鍵。我有鑰匙單獨的字典列出:

varying = {"One": [12,13,14,15], "Two": [20,21,23], "Three": [12,44]} 

我想要做的就是通過改變值中的一個默認的字典中的一個相應的值中的一個成爲可能的所有詞典列表不同的字典。下面是在最終的列表的字典的示例:

{"One": 12, "Two": 2, "Three": 3} 
{"One": 13, "Two": 2, "Three": 3} 
{"One": 14, "Two": 6, "Three": 7} 
{"One": 15, "Two": 10, "Three": 11} 
{"One": 5, "Two": 20, "Three": 7} 
{"One": 9, "Two": 23, "Three": 11} 
{"One": 1, "Two": 2, "Three": 44} 

所以,總體來說有(4 + 3 + 2)* 3 = 27的可能性。 我能夠接近工作,但問題是它變得非常混亂。有沒有乾淨的方法來做到這一點?

+4

看看[itertools](http://docs.python.org/2/library/itertools.html)。 –

+0

你在談論跨產品嗎?我只想更改默認字典中的一個元素。組合也不起作用。我無法告訴任何真正適合我想要做的事情。 – kng

回答

4
default = [{"One": 1, "Two": 2, "Three": 3}, {"One": 5, "Two": 6, "Three": 7}, 
      {"One": 9, "Two": 10, "Three" : 11}] 
varying = {"One": [12,13,14,15], "Two": [20,21,23], "Three": [12,44]} 

result = [dict(d.items() + [(k, x)]) 
       for d in default for k, v in varying.items() for x in v] 

>>> result 
[{'One': 1, 'Three': 12, 'Two': 2}, 
{'One': 1, 'Three': 44, 'Two': 2}, 
{'One': 1, 'Three': 3, 'Two': 20}, 
{'One': 1, 'Three': 3, 'Two': 21}, 
{'One': 1, 'Three': 3, 'Two': 23}, 
{'One': 12, 'Three': 3, 'Two': 2}, 
{'One': 13, 'Three': 3, 'Two': 2}, 
{'One': 14, 'Three': 3, 'Two': 2}, 
{'One': 15, 'Three': 3, 'Two': 2}, 
{'One': 5, 'Three': 12, 'Two': 6}, 
{'One': 5, 'Three': 44, 'Two': 6}, 
{'One': 5, 'Three': 7, 'Two': 20}, 
{'One': 5, 'Three': 7, 'Two': 21}, 
{'One': 5, 'Three': 7, 'Two': 23}, 
{'One': 12, 'Three': 7, 'Two': 6}, 
{'One': 13, 'Three': 7, 'Two': 6}, 
{'One': 14, 'Three': 7, 'Two': 6}, 
{'One': 15, 'Three': 7, 'Two': 6}, 
{'One': 9, 'Three': 12, 'Two': 10}, 
{'One': 9, 'Three': 44, 'Two': 10}, 
{'One': 9, 'Three': 11, 'Two': 20}, 
{'One': 9, 'Three': 11, 'Two': 21}, 
{'One': 9, 'Three': 11, 'Two': 23}, 
{'One': 12, 'Three': 11, 'Two': 10}, 
{'One': 13, 'Three': 11, 'Two': 10}, 
{'One': 14, 'Three': 11, 'Two': 10}, 
{'One': 15, 'Three': 11, 'Two': 10}] 

下面是使用正常的循環,而不是一個列表理解等價的:

result = [] 
for d in default: 
    for k, v in varying.items(): 
     for x in v: 
      result.append(dict(d.items() + [(k, x)])) 

需要注意的是Python的3.x的,你需要使用list(d.items()),而不只是d.items()

1

沒有itertools

default = [{"One": 1, "Two": 2, "Three": 3}, {"One": 5, "Two": 6, "Three": 7}, 
{"One": 9, "Two": 10, "Three" : 11}] 
varying = {"One": [12,13,14,15], "Two": [20,21,23], "Three": [12,44]} 
variations = [] 

for dic in default: 
    for key in varying: 
     for val in varying[key]: 
      new_dict = dict(dic) 
      new_dict[key] = val 
      variations.append(new_dict) 

print variations 

如果你不使用itertools,那麼這段代碼需要有起碼的三個環,它只是在你的問題的性質。

+0

你爲什麼把默認的字典轉換爲字典? – smac89

+0

如果我只是簡單地做了'new_dict = dic',那麼兩者會是一樣的,所以27個字典不會有27個字典,而是隻有三個原始字典的多個實例。 – scohe001

2

一個簡單的解決辦法是:

[ { "One":d["One"], "Two":d["Two"], "Three":d["Three"], i:v } 
    for d in default 
    for i in ["One","Two","Three"] 
    for v in varying[i] 
] 

[ dict(list(d.items()) + list({i:v}.items())) 
    for d in default 
    for i in ["One", "Two", "Three"] 
    for v in varying[i] 
] 

[ dict(list(d.items()) + [(i,v)]) 
    for d in default 
    for i in ["One", "Two", "Three"] 
    for v in varying[i] 
] 

當測試時,所有的三個產生由27個要素的預期的結果。

另請注意,對於更大的數據集,這些表單可能會超出執行時間限制。

相關問題