【问题标题】:How to get an arbitrary element from a frozenset?如何从冻结集中获取任意元素?
【发布时间】:2013-07-23 04:47:45
【问题描述】:

我想从frozenset 中获取一个元素(当然,不要修改它,因为frozensets 是不可变的)。到目前为止我发现的最佳解决方案是:

s = frozenset(['a'])
iter(s).next()

按预期返回:

'a'

换句话说,有没有办法从frozenset 中“弹出”一个元素而不实际弹出它?

【问题讨论】:

  • 我认为你的方法和其他方法一样好。如果你想要一个随机元素,你可以查看random.sample(fset, 1)
  • 为什么要弹出元素,因为它是任意的?
  • 我只想从 freezeset 中获取一些任意元素。我不应该使用 pop 这个词,因为集合保持不变。这类似于偷看堆栈的第一个元素而不弹出它。
  • 这就是我使用的(但使用 next 内置而不是方法)。
  • 不要使用.next()的方法。至少从 python2.6 开始就有一个 next() 内置函数,使用它意味着您的代码也可以在 next 方法重命名为 __next__ 的 python3 中工作。

标签: python iterator set immutability


【解决方案1】:

(总结cmets给出的答案)

您的方法与任何方法一样好,但需要注意的是,从 Python 2.6 开始,您应该使用 next(iter(s)) 而不是 iter(s).next()

如果您想要一个 随机 元素而不是 任意 元素,请使用以下内容:

import random
random.sample(s, 1)[0]

这里有几个例子展示了这两者之间的区别:

>>> s = frozenset("kapow")
>>> [next(iter(s)) for _ in range(10)]
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
>>> import random
>>> [random.sample(s, 1)[0] for _ in range(10)]
['w', 'a', 'o', 'o', 'w', 'o', 'k', 'k', 'p', 'k']

【讨论】:

  • 为什么要打电话给next(iter(s))而不是iter(s).next()
  • @rynemccall 因为在 Python 3 中,iter.next() doesn't exist.
【解决方案2】:

如果你知道frozenset中只有一个元素,你可以使用iterable unpacking:

s = frozenset(['a'])
x, = s

这在某种程度上是原始问题的一个特例,但它有时会派上用场。

如果你有很多这些事情要做,它可能会比 next(iter..:

>>> timeit.timeit('a,b = foo', setup='foo = frozenset(range(2))', number=100000000)
5.054765939712524
>>> timeit.timeit('a = next(iter(foo))', setup='foo = frozenset(range(2))', number=100000000)
11.258678197860718

【讨论】:

  • ValueError: too many values to unpack 有多个元素。
  • 如前所述,这只适用于恰好冻结集中的一个元素。
【解决方案3】:

您可以与 python 3 一起使用:

>>> s = frozenset(['a', 'b', 'c', 'd'])
>>> x, *_ = s
>>> x
'a'
>>> _, x, *_ = s
>>> x
'b'
>>> *_, x, _ = s
>>> x
'c'
>>> *_, x = s
>>> x
'd'

【讨论】:

    【解决方案4】:

    使用list

    list_ = list(frozenset("Benyamin"))
    

    使用generator

    def get_frozenset_elements(frozen_set):
        for i in frozen_set:
            yield i
    
    gen_ = get_frozenset_elements(frozenset("Benyamin"))
    next(gen_)
    next(gen_)
    next(gen_)
    ...
    

    使用iterator

    iter_ = iter(frozenset("Benyamin"))
    next(gen_)
    next(gen_)
    next(gen_)
    ...
    

    [注意]:

    Difference between Python's Generators and Iterators

    【讨论】:

    • 其中第一个只是写list(my_frozenset)的复杂方式,对于大集合来说相当浪费。第二种只是写next(iter(my_frozenset))的复杂方式,这已经是公认的答案了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2013-04-03
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多