2016-07-26 87 views
0

假設我有兩個字典的列表:遍歷字典的列表和列表內的值

iter_list = [{0: [2, 1, 3], 
       1: [3, 2, 1], 
       2: [1, 2, 3], 
       3: [2, 3, 1], 
       4: [1, 2, 3], 
       5: [2, 3, 1]}, 
      {0: [2, 3, 1], 
       1: [1, 2, 3], 
       2: [1, 2, 3], 
       3: [1, 2, 3], 
       4: [2, 3, 1], 
       5: [1, 3, 2]}] 

每個字典已經6個鍵至5 編號爲0我想通過每個字典一個環在時間,並且使輸出與鍵(按鍵值排序)和相應列表的第一個值成對,第一個值與第二個鍵等相對應,其後是鍵和第二個鍵值等希望該示例輸出將闡明:

0 2 
1 3 
2 1 
3 2 
4 1 
5 2 
0 1 
1 2 
2 2 
3 3 
4 2 
5 3 
0 3 
1 1 
2 3 
3 1 
4 3 
5 1 
0 2 //2nd dictionary iteration 
1 1 
2 1 
3 1 
4 2 
5 1 
0 3 
1 2 
2 2 
3 2 
4 3 
5 3 
0 1 
1 3 
2 3 
3 3 
4 1 
5 2 

我只能弄清楚如何遍歷第一個字典的第一個位置,但不知道如何使用[0]作爲迭代變量來遍歷值列表中的所有位置繼續閱讀下一本詞典。

for i in iter_list: 
    for key, value in i.iteritems(): 
      print key, value[0] 

任何幫助,非常感謝!謝謝!

+0

爲什麼它不以3,1,2結束? –

+1

如果你使用唯一的值而不是總是相同的值,那麼這個例子會更清晰。它是否需要那麼大? –

+0

@StefanPochmann我實際上比我原來的要短得多,但不想讓列表長度2和字典數量2都混淆,以查看新迭代開始的位置。我正在使用的例子是使用排列,這就是爲什麼我沒有使用獨特的值,但絕對是一個好點!感謝您的反饋! – Shayna

回答

4

如果我理解正確的話,你的情況,你需要遍歷iter_list 3次

>>> for i in iter_list: 
...  for x in range(3): 
...   for key, value in i.iteritems(): 
...    print key, value[x] 
... 

輸出:

0 2 
1 3 
2 1 
3 2 
4 1 
5 2 
0 1 
1 2 
2 2 
3 3 
4 2 
5 3 
0 3 
1 1 
2 3 
3 1 
4 3 
5 1 
0 2 
1 1 
2 1 
3 1 
4 2 
5 1 
0 3 
1 2 
2 2 
3 2 
4 3 
5 3 
0 1 
1 3 
2 3 
3 3 
4 1 
5 2 
+0

嗨,非常感謝您的回答!實際上只有兩個迭代,每個字典一個。我們的數字在第二輪key = 0時分歧,我有(0,1),而你有(0,2)。這是因爲我想在循環遍歷第二個字典之前完全遍歷第一個字典,並遍歷每個循環的位置。 – Shayna

+0

@HaifengZhang:如果你換了前兩個循環,你可能會是正確的。 – SuperSaiyan

+0

@Shayna交換'範圍內的x(3):'和'我在iter_list中:' – haifzhan

1

列表理解應該做的:

>>> output_list = [[k, d[k][i]] for d in iter_list for i in range(3) for k in sorted(d)]: 
>>> for k, dki in output_list: 
...  print k, dki 
... 
0 2 
1 3 
2 1 
3 2 
4 1 
5 2 
0 1 
1 2 
2 2 
3 3 
4 2 
5 3 
0 3 
1 1 
2 3 
3 1 
4 3 
5 1 
0 2 
1 1 
2 1 
3 1 
4 2 
5 1 
0 3 
1 2 
2 2 
3 2 
4 3 
5 3 
0 1 
1 3 
2 3 
3 3 
4 1 
5 2 
1

也許你想這樣做:

for i in iter_list: 
    for j in range(3): 
     for key, value in i.iteritems(): 
      print key, value[j] 

假設字典中的值的固定長度爲3,否則您必須找出其中3來自哪裏。 例如,它可能是在所有字典的所有值的最小值長度:

>>> min(len(v) for k,v in i.iteritems() for i in iter_list) 
3 
2

使用zipitertools.chainunpacking花樣的不同方法:

from itertools import chain 
packed_pairs = zip(*[[(k, v) for v in vs] for ds in iter_list for k, vs in ds.items()]) 
pairs = chain(*packed_pairs) 
for pair in pairs: 
    print pair[0], pair[1] 

輸出:

0 2 
1 3 
2 1 
3 2 
4 1 
5 2 
0 2 
1 1 
2 1 
3 1 
4 2 
5 1 
0 1 
1 2 
2 2 
3 3 
4 2 
5 3 
0 3 
1 2 
2 2 
3 2 
4 3 
5 3 
0 3 
1 1 
2 3 
3 1 
4 3 
5 1 
0 1 
1 3 
2 3 
3 3 
4 1 
5 2 

備註:如果您想重新使用pairs,請務必使用pairs = list(pairs)