python - 从集合中获取一个或无

标签 python generator

您有一个 N 大小的集合,但想使用单个项目(概念上是一个 0 或 1 大小的集合)这样的问题是很常见的.

我可以写出传统的 if:

def singular_item(collection):
    if collection:
        return collection[0]
    else:
        return None

并简化为:

def singular_item(collection):
    return collection[0] if collection else None

但它不适用于可迭代对象,只能用于具有定义大小的集合。例如传递生成器会失败:

singular_item((_ for _ in range(10)))
=> TypeError: 'generator' object has no attribute '__getitem__'

所以我通常做的是:

def singular_item(collection):
    return next((_ for _ in collection), None) 

singular_item([1]) -> 1
singular_item([1,2,3]) -> 1
singular_item([]) -> None

这适用于任何集合(或可迭代对象),但创建一个仅获取一个项目的生成器感觉有些笨拙。此外,它的可读性也有所降低:另外两个示例更明确地说明了代码试图做什么。

所以我的问题是:

  • 是否有更好的方法来做到这一点,也许是使用内置函数?
  • 您是否在创建仅获取一个项目的生成器时浪费资源?

最佳答案

使用 iter() function而是创建一个可迭代对象:

def singular_item(collection):
    return next(iter(collection), None)

iter() 调用collection.__iter__() 获取一个可迭代对象供next() 循环,可以是collection 对象本身。

否则迭代器非常高效,这种方法是处理任何可迭代对象或序列的正确方法。

关于python - 从集合中获取一个或无,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20356286/

相关文章:

python - 如何获取值在 pandas 的任何过滤列中至少匹配一次的行

javascript - Yeoman Javascript错误涉及 'mkdir'

java - 如何去除使用后随机生成的字母?

python - 是否可以在 Python 图像库 (PIL) 中屏蔽图像?

python jsonschema 删除额外的并使用默认值

python - 为什么不能使用生成器函数作为插槽?

Java LibGdx 2d 地形生成器

使用WELL512的两个整数之间的c++随机数

python - 模拟 CSV DictReader

python - Django ORM 分组依据