python - 从集合中选择单个项目 : Python

标签 python iterator generator

我创建了一个实用函数来从生成器表达式返回预期的单个项目

print one(name for name in ('bob','fred') if name=='bob')

这是一个好方法吗?

def one(g):
    try:
        val = g.next()
        try:
            g.next()
        except StopIteration:
            return val
        else:
            raise Exception('Too many values')
    except StopIteration:
        raise Exception('No values')

最佳答案

更简单的解决方案是使用元组拆包。这已经可以完成您想要的一切,包括检查它是否只包含一项。

单个项目:

 >>> name, = (name for name in ('bob','fred') if name=='bob')
 >>> name
 'bob'

项目太多:

>>> name, = (name for name in ('bob','bob') if name=='bob')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack

没有项目:

>>> name, = (name for name in ('fred','joe') if name=='bob')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 0 values to unpack

关于python - 从集合中选择单个项目 : Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46886903/

相关文章:

python - 在 Python 中验证 ctypes 类型精度

python - 按第二项(整数值)对元组列表进行排序

使用协议(protocol)的 Python 语法错误

python - 为什么 Python 中没有 first(iterable) 内置函数?

c++ - 如何生成仅包含 0's and 9' 的数字

python - 有没有更好的方法在Python中读取多个txt文件?

c# - 有没有办法在迭代期间编辑字典的值?

c++ - 使用 foreach 循环连续迭代两个结构的简单方法

c++ - 关于迭代器begin()函数的问题

ruby-on-rails - 让默认的 Rails 生成器调用自定义生成器