从集合中获取一个或者无

 023597 发布于 2023-02-13 10:35

在你有一个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对象本身.

迭代器非常有效,否则,这种方法只是处理任何迭代或序列的正确方法.

1 个回答
  • 使用该iter()函数来创建一个iterable:

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

    iter()调用collection.__iter__()以获取可next()循环的可迭代对象,这可能是collection对象本身.

    迭代器非常有效,否则,这种方法只是处理任何迭代或序列的正确方法.

    2023-02-13 10:38 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有