2016-02-05 36 views
3

我有幾個名單如下:構建詞典列表從幾個名單在Python

Pargs = [args.Pee, args.Pem,...,args.Pet] # 9 elements of boolean type 
indices = [(0,0),(0,1),...,(2,2)] # 9 possible combinations (i,j), i = 0,1,2; j = 0,1,2 
D = [{},{},...,{}] # 9 dictionaries, desired result 

我希望看到應該是這樣的結果:

D = [{event:args.Pee,i:0,j:0},{event:args.Pem,i:0,j:1},...{event: args.Pet,i:2,j:2}] 

字典必須按照上圖所示進行訂購。

我試圖

for d in D: 
    for i in range(3): 
     for j in range(3): 
      d['i'],d['j'] = i,j 

但它不會做的伎倆。我已經嘗試過許多使用zip(),product(),dict()的算法,但無濟於事...

+0

你只是結合了'Pargs [0]'和'indices [0]','Pargs [1]'和'indices [1]'等等嗎? – glibdud

+0

@glibdud就我所知,是的。 – Albert

+0

是否必須下訂單? – SirParselot

回答

4

有了理解和OrderedDict,演示:

from collections import OrderedDict 
pargs = ['arg1', 'arg2', 'arg3', 'arg4', 'arg5', 'arg6', 'arg7', 'arg8', 'arg9'] 
indices = ((x,y) for x in range(3) for y in range(3)) 
result = [OrderedDict([('event',p), ('i',i), ('j',j)]) for p,(i,j) in zip(pargs, indices)] 
print(result) # [OrderedDict([('event', 'arg1'), ('i', 0), ('j', 0)]), OrderedDict([('event', 'arg2'), ('i', 0), ('j', 1)]), OrderedDict([('event', 'arg3'), ('i', 0), ('j', 2)]), OrderedDict([('event', 'arg4'), ('i', 1), ('j', 0)]), OrderedDict([('event', 'arg5'), ('i', 1), ('j', 1)]), OrderedDict([('event', 'arg6'), ('i', 1), ('j', 2)]), OrderedDict([('event', 'arg7'), ('i', 2), ('j', 0)]), OrderedDict([('event', 'arg8'), ('i', 2), ('j', 1)]), OrderedDict([('event', 'arg9'), ('i', 2), ('j', 2)])] 

編輯

如果我誤解了你的要求,並在字典順序不要緊,你可以做到這一點沒有OrderedDict這樣的:

result = [{'event':p, 'i':i, 'j':j} for p,(i,j) in zip(pargs, indices)] 
+0

哦,沒關係。哇偉大的解決方案!它整潔簡潔。非常感謝! – Albert

+0

@Albert沒問題:) – timgeb

1

從您的問題的外觀看,您正在尋找類似如下的東西:

>>> Pargs = [str(i) for i in range(9)] 
>>> Pargs 
9: ['0', '1', '2', '3', '4', '5', '6', '7', '8'] 
>>> indeces = [(i, j) for i in range(3) for j in range(3)] 
10: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] 
>>> D = [{'event':Pargs[ind], 'i':i[0], 'j':i[1]} for ind, i in enumerate(indeces)] 
>>> D 
11: [{'event': '0', 'i': 0, 'j': 0}, 
{'event': '1', 'i': 0, 'j': 1}, 
{'event': '2', 'i': 0, 'j': 2}, 
{'event': '3', 'i': 1, 'j': 0}, 
{'event': '4', 'i': 1, 'j': 1}, 
{'event': '5', 'i': 1, 'j': 2}, 
{'event': '6', 'i': 2, 'j': 0}, 
{'event': '7', 'i': 2, 'j': 1}, 
{'event': '8', 'i': 2, 'j': 2}] 
>>> 

你似乎在試圖缺少的關鍵是在同一時間通過的indeces和Pargs進行迭代。

+0

Yap!這正是我需要的。我同時感到傷心和快樂。幸福的我終於得到了我需要的東西,並傷心難過,因爲我無法自己想出來而感到難過。萬分感謝! – Albert

+0

非常歡迎。以美味業力的形式表達你的感謝,並接受我的回答:) –

+0

我投了你的回覆。但是,根據我的判斷,上面的人提出了一個更美麗的解決方案。儘管它與你的沒有太大區別。這裏真的很難選擇最好的答案! – Albert

0

你只想要一個循環,你跟蹤多個指標。也許這是不是你要找的是什麼,但何去何從

i = 0 
j = 0 
for d in range(9): 
    D[d] = {'event':Pargs[d], 'i':i, 'j':j} 
    if j == 2: 
     j = 0 
     i += 1 
    else: 
     j += 1 
0

如果Pargsindices有相同數量的元素,你可以做的這兩種方式之一,這取決於你以「類型的字典必須訂購」是什麼意思。

這將在你的問題中顯示的順序詞典列表:

D = [{'event': parg, 'i':pair[0], 'j':pair[1]} 
     for parg, pair in zip(Pargs, indices)] 

如果你的意思是你想每個字典的內容是在顯示的順序(以及他們的訂單在列表中),您需要使用collections.OrderedDict來保存數據,因爲正規詞典不保留其內容(鍵,值對)的順序。

from collections import OrderedDict 

D = [OrderedDict([('event', parg), ('i', pair[0]), ('j', pair[1])]) 
     for parg, pair in zip(Pargs, indices)]