【问题标题】:Is there a Python dict without values?是否有没有值的 Python 字典?
【发布时间】:2013-10-27 14:39:15
【问题描述】:

而不是这个:

a = {"foo": None, "bar": None}

有没有办法写这个?

b = {"foo", "bar"}

并且仍然让b 具有恒定时间访问(即不是 Python 集,无法键入)?

【问题讨论】:

  • “无法键入”是什么意思?如果没有值,“键入”的唯一方法是查看是否存在键,可以使用 obj in set 进行设置。
  • obj in set 是否有固定时间访问权限?
  • 不清楚你在问什么......具体来说你需要什么样的访问权限,以及你所说的键入是什么意思
  • @RohitJain 实际上最坏的情况是 O(n) iirc
  • wiki.python.org/moin/TimeComplexity ... 是的,但平均情况为 O(1)

标签: python dictionary


【解决方案1】:

实际上,在 Python 2.7 和 3.2+ 中,这确实有效:

>>> b = {"foo", "bar"}
>>> b
set(['foo', 'bar'])

您不能在集合上使用[] 访问权限(“key into”),但您可以测试是否包含:

>>> 'x' in b
False
>>> 'foo' in b
True

集合尽可能接近无值字典。它们具有一般情况下的常量时间访问,需要可散列的对象(即集合中没有存储列表或字典),甚至支持它们自己的理解语法:

{x**2 for x in xrange(100)}

【讨论】:

  • 如何添加一个无价值的键,虽然像 b += ... ?
  • 对单个项目使用 b.add(v) 或使用 b.update(v) 从可迭代对象中复制元素。
【解决方案2】:

是的,sets

set() -> new empty set object
set(iterable) -> new set object

Build an unordered collection of unique elements.

相关:How is set() implemented?

时间复杂度:https://wiki.python.org/moin/TimeComplexity#set

【讨论】:

  • 注意 set 文字仅在 2.7 或 3.x 中
【解决方案3】:

为了在恒定时间内“键入”一个集合,请使用in

>>> s = set(['foo', 'bar', 'baz'])
>>> 'foo' in s
True
>>> 'fork' in s
False

【讨论】:

  • 这可能有点令人困惑。 "a" 在集合中,因为 set("abcd") 将字符串视为四个字符的可迭代对象。 set("abcd")set(['a', 'c', 'b', 'd']) 相同。因此,虽然"fork" 绝对不在集合中,"abcd" 也不是,这个答案可能暗示。
  • set(['foo', 'bar', 'baz') 应该是set(['foo', 'bar', 'baz']),不过这样更清楚:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2015-05-03
  • 2011-04-03
相关资源
最近更新 更多