Py学习  »  Python

在python上查找同一字典中键和值之间的差异

python495 • 4 年前 • 833 次点击  

我有一个具有相似键和值的字典,我正在查找字典中的值中没有出现的键。

这是我打印字典时的输出, d1

d1= {"A": ["J"], "B": ["A"], "C": ["A", "D", "J"], "D": ["A", "J"]}

从上面的代码中,键“B”和“C”是值中没有出现的两个键,我希望能够在列表中打印出来。

这是我的代码:

keysNotInValues = []
d1_keys = (d1.keys())

for key in d1_keys:
    flag = True
    for keys,values in d1.items():
        if key in values:
            flag == False

    if flag == True:
        keysNotInValues.append(key)

print(keysNotInValues)

我收到的输出只是所有键的列表。

['A', 'B', 'C', 'D']

我想要输出:

['B', 'C']
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/57341
 
833 次点击  
文章 [ 3 ]  |  最新文章 4 年前
Harshal Parekh
Reply   •   1 楼
Harshal Parekh    4 年前

解决方案可以简单到:

d1= {"A": ["J"], "B": ["A"], "C": ["A", "D", "J"], "D": ["A", "J"]}

values = []

for v in d1.values():
  values += v

for k in d1.keys():
  if k not in values:
    print(k)
Dan H
Reply   •   2 楼
Dan H    4 年前

我认为你问题的本质是你重新设置 flag=True 每次循环迭代时。在这种代码结构中,您找不到“不在任何值中的键”,而是找到“至少一个值中缺少的键”。由于至少有一个值缺少每个键,因此函数将返回所有键。

一种方法是使用Python的内置 set()

d1 = {"A": ["J"], "B": ["A"], "C": ["A", "D", "J"], "D": ["A", "J"]}

set_of_keys = set(d1.keys())

set_of_values = set()
for vals in d1.values():
    set_of_values.update(vals)

print(set_of_keys)
print(set_of_values)

values_that_arent_keys = set_of_values - set_of_keys
print(values_that_arent_keys)

keys_that_arent_values = set_of_keys - set_of_values
print(keys_that_arent_values)

给予:

{'D', 'C', 'B', 'A'}
{'J', 'D', 'A'}
{'J'}
{'C', 'B'}

你可以用 sorted() 如果你想按字母顺序打印你的作品集。

Iain Shelvington
Reply   •   3 楼
Iain Shelvington    4 年前

可以使用集合计算两个集合之间的差异

keys = set(d1)
values = set(item for sublist in d1.values() for item in sublist)
print(keys - values)  # {'C', 'B'}