我看过几个类似的线程,但无法获得可行的解决方案。我循环(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]}
答案 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次。因为,正如您在上面的评论中所述,dict1
和dict2
之间仅共享一个密钥,因此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