【问题标题】:Use A Single Line To Loop Two Dictionaries To Create List使用单行循环两个字典来创建列表
【发布时间】:2019-07-28 09:15:31
【问题描述】:

我查看了几个类似的线程,但无法获得可行的解决方案。我正在循环 (2) 字典,试图从一个基于另一个键的值创建一个列表。我已经完成了 for 循环,但如果可能的话,我希望使用单行。我的代码带有 for 循环

  for k, v in dict1.items():
    for value in dict2[k]:
    temp.append(value)

在通过临时列表的第一个循环将是并且来自上面的代码:

[16,18,20,22,24,26]

然后我使用 min 来获取列表的最小值。现在我想将 for 循环压缩为一个衬里。我已经整理好了

temp=[dict2.values() for k in dict1.keys() if k in dict2.keys()]

执行时,temp 不是 dict1 中存在的 k 的单个列表,而是得到所有 dict2 中所有值的列表列表。

[[16,18,20,22,24,26], [12,16,18,20,22,24], [16,18,22,26,30,32]]

似乎忽略了 if 语句。我知道我的 dict1 在这种情况下只有 1 个键,并且我知道 dict2 中存在 1 个键。我的一个班轮错了吗?

字典的输入值:

dict1={'table1':[16,18,20,22,24,26]}

dict2={'table1':[16,18,20,22,24,26],'table2': [12,16,18,20,22,24], 'table3': [16,18,22,26,30,32]}

【问题讨论】:

    标签: python list dictionary for-loop key


    【解决方案1】:

    您可以使用运算符itemgetter():

    from operator import itemgetter
    from itertools import chain
    
    dict1 = {'table1': [16,18,20,22,24,26], 'table2': [12,16,18,20,22,24]}    
    dict2 = {'table1': [16,18,20,22,24,26], 'table2': [12,16,18,20,22,24], 'table3': [16,18,22,26,30,32]}
    
    common_keys = set(dict1).intersection(dict2)
    sublists = itemgetter(*common_keys)(dict2)
    
    if len(common_keys) == 1:
        max_val = max(sublists)
    else:
        max_val = max(chain.from_iterable(sublists))
    
    print(max_val)
    # 26
    

    【讨论】:

      【解决方案2】:

      您可以遍历一个字典来检查匹配的键并创建一个列表列表。使用chain.from_iterable扁平化列表并调用min()

      from itertools import chain
      
      dict1 = {'table1': [16,18,20,22,24,26]}    
      dict2 = {'table1': [16,18,20,22,24,26], 'table2': [12,16,18,20,22,24], 'table3': [16,18,22,26,30,32]}
      
      temp = [dict2[k] for k in dict1 if k in dict2]
      
      print(min(chain.from_iterable(temp)))
      # 16
      

      【讨论】:

      • 我认为你甚至可以将 list(value for value in dict2[k]) 缩短为 dict2[k]
      • 如果dict1 中只有一个键,则可以使用min(temp[0]) 而无需任何导入。
      【解决方案3】:

      您的列表理解不起作用的原因:

      看起来dict2有3个键值对,值分别是[16,18,20,22,24,26], [12,16,18,20,22,24][16,18,22,26,30,32]。您在列表理解中所做的转换为

      for k in dict1.keys():
          if k in dict2.keys():
              temp.append(dict2.values())
      

      所以如果dict1有,比如说,3 个键,这个 for 循环将重复 3 次。因为,正如您在上面的评论中所说,dict1dict2 之间只共享一个密钥,if 语句只有一次 True,所以 dict2.values() 的所有项目将附加到 temponce。如果我做对了,您想要做的是将所有项目附加到dict2 的值之一中,即分配给两个字典共享的一个键的值。你的想法非常接近,你只需要添加一点点。作为一个班轮,它看起来像这样:

      temp = [x for x in dict2[k] for k in dict1.keys() if k in dict2.keys()]
      

      或者,不同的:

      temp = [dict2[k] for k in set(dict1.keys()).intersection(set(dict2.keys()))]
      

      【讨论】:

      • dict1 总是有更少或相等数量的到 dict2 的键。 dict2 有点像大师,而 dict1 是由它创建的。我喜欢已经提供的两个答案,它们都指出了我的缺点,这很有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      相关资源
      最近更新 更多