我正在使用包含(position, name)
格式的元组的集合,并且需要在忽略位置时检查名称集中是否已存在值。
有没有办法可以使用类似于in
的{{1}}运算符,在比较期间忽略元组中的位置变量,但仍然检索它?类似于value in my_set
或(_, value) in my_set
的内容,但那些不起作用,第一个返回不正确的值,第二个引发SyntaxError。
显然我可以使用像(*, value) in my_set)
那样的循环或生成器理解,但是它不会从该元组中检索位置变量,而且我很好奇是否存在某种形式的单行理解会这样做。
答案 0 :(得分:1)
您可以使用现有数据结构(迭代集合)在O(n)中执行此操作,但对于O(1),您必须更改数据结构。您需要进行查找:
from collections import defaultdict
positions = defaultdict(list)
for position, name in my_set:
positions[name].append(position)
现在这是一个O(1)操作:
name in positions
按名称检索所有内容:
for pos in positions[name]:
...
如果您希望这与my_set
突变保持同步,那么您需要在添加/删除positions
的同时添加挂钩以更新my_set
。完全重新考虑底层数据结构可能更好,例如,首先使用dict而不是set。