【问题标题】:Ignoring a value in tuple comparison but still retrieving it忽略元组比较中的值但仍检索它
【发布时间】:2018-06-01 17:54:53
【问题描述】:

我正在使用一个包含 (position, name) 形式的元组的集合,并且需要检查名称的集合中是否已经存在一个值,同时忽略位置。

有没有一种方法可以使用类似于value in my_setin 运算符,在比较期间忽略元组中的位置变量,但仍然检索它?类似于 (_, value) in my_set(*, value) in my_set) 的东西,但它们不起作用,第一个返回不正确的值,第二个引发 SyntaxError。

显然,我可以使用循环或生成器理解,如value in (tup[1] for tup in my_set),但这不会从该元组中检索位置变量,我很好奇是否有某种形式的单行理解可以做到这一点。

【问题讨论】:

  • if val in [name for (position, name) in my_set]:
  • @Sam 如果我只是检查集合中是否存在 val,这将起作用,但我想检查集合中是否存在val,然后从集合中检索该值。不知道我解释清楚了没有。
  • @PatrickArtner 我正在使用 GUI 中的列表视图,因此我将数据存储在列表中,并且正在玩弄使用集合来停止重复,这引发了这个问题.但我想得越多,用字典做可能更有意义,只做contents.keys()

标签: python set tuples


【解决方案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 突变保持同步,那么您需要在添加/删除my_set 的同时添加用于更新positions 的挂钩。完全重新考虑底层数据结构可能会更好,例如,首先使用字典而不是集合。

【讨论】:

  • 既然你在完成后将default_factory 设置为None,也许只使用setdefault 和一个普通的字典? positions = {}; ... positions.setdefault(name, []).append(position)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2023-03-21
  • 2018-08-16
  • 2018-03-29
  • 1970-01-01
  • 2012-10-03
相关资源
最近更新 更多