代码之家  ›  专栏  ›  技术社区  ›  recursive

如何从Python中的单个成员集中提取成员?

  •  49
  • recursive  · 技术社区  · 16 年前

    我最近遇到了一个场景,在这个场景中,如果一个集合只包含一个元素,我想对该元素做些什么。为了得到元素,我决定采用以下方法:

    element = list(myset)[0]
    

    但这并不是很令人满意,因为它创建了一个不必要的列表。它也可以通过迭代来完成,但是迭代似乎也不自然,因为只有一个元素。我错过了简单的东西吗?

    5 回复  |  直到 7 年前
        1
  •  73
  •   Julian    7 年前

    tuple拆箱工程。

    (element,) = myset
    

    (顺便说一下,python dev已经研究过了,但拒绝了添加 myset.get() 从集合中返回任意元素。 Discussion here ,Guido van Rossum回答 1 2 )

    我个人最喜欢的任意元素是(当你有一个未知的数字,但如果你只有一个的话也可以使用):

    element = next(iter(myset)) ¹
    

    :在python 2.5及之前版本中,必须使用 iter(myset).next()

        2
  •  18
  •   Alex Martelli    16 年前

    在生成一个元组和一个迭代器之间,这几乎是一次洗礼,但迭代以一个鼻子赢得了胜利……

    $ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]'
    1000000 loops, best of 3: 0.465 usec per loop
    $ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]'
    1000000 loops, best of 3: 0.465 usec per loop
    $ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))'
    1000000 loops, best of 3: 0.456 usec per loop
    $ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))'
    1000000 loops, best of 3: 0.456 usec per loop
    

    不知道为什么所有的答案都使用旧的语法 iter(x).next() 而不是新的 next(iter(x)) 这对我来说似乎更好(而且也适用于Python3.1)。

    但是,解包将赢得两个方面的胜利:

    $ python2.6 -mtimeit -s'x=set([1])' 'a,=x'
    10000000 loops, best of 3: 0.174 usec per loop
    $ python2.6 -mtimeit -s'x=set([1])' 'a,=x'
    10000000 loops, best of 3: 0.174 usec per loop
    

    当然,这是针对单个项目集的(如其他人提到的那样,后一种形式具有快速失败的优势,如果您“知道”的集合只有一个项目实际上有几个项目的话)。对于具有任意n>1项的集合,元组速度减慢,ITER不会:

    $ python2.6 -mtimeit -s'x=set(range(99))' 'a=next(iter(x))'
    1000000 loops, best of 3: 0.417 usec per loop
    $ python2.6 -mtimeit -s'x=set(range(99))' 'a=tuple(x)[0]'
    100000 loops, best of 3: 3.12 usec per loop
    

    所以,打开单件箱子的包装, 下一个(ITER(X)) 对于一般情况,似乎是最好的。

        3
  •  12
  •   Craig McQueen Dr. Watson    7 年前

    我估计 kaizer.se's answer 很棒。但是如果你设定 可以 包含多个元素,而您想要一个不那么随意的元素,您可能需要使用 min max .例如。:

    element = min(myset)
    

    或:

    element = max(myset)
    

    (不要使用) sorted ,因为这样做会产生不必要的开销。)

        4
  •  3
  •   Helmut    8 年前

    我建议:

    element = myset.pop()
    
        5
  •  2
  •   Oren S    16 年前

    你可以用 element = tuple(myset)[0] 哪个效率更高,或者,你可以做一些类似的事情

    element = iter(myset).next()
    

    我想构造迭代器比构造元组/列表更有效。