在你有一个N
大小的集合但想要使用单一项目(概念上是一个0 or 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
但它不适用于iterables,只有定义大小的集合.例如,传递生成器将失败:
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
这适用于任何集合(或可迭代),但感觉有点笨拙创建一个生成器只获取一个项目.此外,可读性在某种程度上被杀死了:另外两个例子更清楚地表明代码正在尝试做什么.
所以我的问题是:
是否有更好的方法可以使用内置函数?
在创建一个只生成一个项目的生成器时,您是否浪费资源?
Martijn Piet.. 5
使用该iter()
函数来创建一个iterable:
def singular_item(collection): return next(iter(collection), None)
iter()
调用collection.__iter__()
以获取可next()
循环的可迭代对象,这可能是collection
对象本身.
迭代器非常有效,否则,这种方法只是处理任何迭代或序列的正确方法.
使用该iter()
函数来创建一个iterable:
def singular_item(collection): return next(iter(collection), None)
iter()
调用collection.__iter__()
以获取可next()
循环的可迭代对象,这可能是collection
对象本身.
迭代器非常有效,否则,这种方法只是处理任何迭代或序列的正确方法.