【问题标题】:Loop over list of dictionaries and within list values循环遍历字典列表和列表值
【发布时间】:2016-07-27 06:38:41
【问题描述】:

假设我有一个包含两个字典的列表:

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 个键,编号从 0 到 5。 我想按键的顺序一次遍历每个字典,并让输出与键(按键值排序)和对应列表的第一个值成对,第一个值对应于第二个键等,然后是键和第二个值等。希望示例输出能够澄清:

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]

非常感谢任何帮助!谢谢!

【问题讨论】:

  • 为什么不以3,1,2结尾?
  • 如果您使用唯一值而不是始终使用相同的少数值,该示例会更清晰。它需要那么大吗?
  • @StefanPochmann 我实际上使它比我原来的要短得多,但不希望列表长度为 2 和字典编号为 2 来混淆新迭代的开始位置。我正在使用的示例是使用排列,这就是我不使用唯一值的原因,但绝对是一个好点!感谢您的反馈!

标签: python python-2.7


【解决方案1】:

如果我理解正确,在你的情况下,你需要迭代 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

【讨论】:

  • 您好,非常感谢您的回答!实际上只有两次迭代,每个字典一次。我们的数字在第二轮 key = 0 时出现分歧,我有 (0,1) 而你有 (0,2)。这是因为我想在遍历第二个字典之前完全浏览第一个字典,移动每个循环的位置。
  • @HaifengZhang:如果你交换前两个循环,你可能是正确的。
  • @Shayna 交换 for x in range(3):for i in iter_list:
  • @SuperSaiyan 同意。我误解了OP的意思,我已经编辑了我的代码
【解决方案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)

【讨论】:

    【解决方案3】:

    也许你想这样做:

    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
    

    【讨论】:

      【解决方案4】:

      列表推导应该这样做:

      >>> 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 2019-07-10
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 2016-08-31
        相关资源
        最近更新 更多