您有一个 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/