2016-07-26 126 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)