使用单行循环两个字典以创建列表

时间:2019-03-06 16:16:24

标签: python list dictionary for-loop key

我看过几个类似的线程,但无法获得可行的解决方案。我循环(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()]

执行后,我不再从temp1中找到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]}

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

无法理解列表的原因

看起来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()的所有项将一次附加到temp。如果我没做错,您想做的就是在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()))]

答案 2 :(得分:0)

您可以使用运算符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