检查列表是否包含任何字典键

时间:2021-06-06 18:20:26

标签: python list dictionary

db_from_env = dj_database_url(conn_max_age=600)
DATABASE['default'].update(db_from_env)

假设我有一个前面提到的字典,每个键都是一个元组。为什么会这样:

d = {('shot',): ['V'], ('I',): ['NP']}
s = ["I", "shot"]
s1 = ["I"]
s2 = ["shot"]

print(str(tuple(s,)))
print([i in d for i in tuple(s,)])
print(bool(set(tuple(s,)).intersection(d)))
print(d[tuple(s1,)])
print(d[tuple(s2,)])
for i in set(tuple(s,)).intersection(d):
    print("Element "+i+" was found.")

取而代之的是:

('I', 'shot')
[False, False]
False
['NP']
['V']

1 个答案:

答案 0 :(得分:1)

Ishot 都不是 d 中的键,因此两者都是 False。当您从列表中创建元组时,列表中的每个值都用于创建元组:

>>> tuple(["I", "shot"], )
('I', 'shot')

因此,当您在列表理解中迭代该列表时:

[i in d for i in tuple(s,)]

你正在做的是:

for i in ('I', 'shot'):
  if i in d:  # this will be 'I' in the first iteration, 'shot' in the next
      ...

由于 Ishot 本身都不是键,所以结果是 False。您的字典中实际上使用的键是元组,而不是字符串(这是您最终要查找的内容)。

然而,您可能想要实现的是(因为 tuple(s, ) 转换没有做任何有用的事情),是查找一个以字符串作为字典中第一个元素的元组,而不是迭代它:

>>> [(i, ) in d for i in s]
[True, True]

总结一下:

>>> 'I' in d
False
>>> 'shot' in d
False
>>> ('shot', ) in d
True
>>> ('I', ) in d
True

最后两个示例创建一个元组,然后检查该元组是否是字典中的键。

对键及其值的相同混淆也可能是导致 set 出现问题的原因,但您希望在那里更明确 - 如果您想要一个迭代器,请使用 d.keys()只给你字典中的键,然后在你认为有必要实现你想要的时将这两组相交。

相关问题