如何解决列表理解中迭代器链接的替代方法?
我想在列表理解中将两个或多个不同的迭代器链接在一起。
假设我想将大写和小写字母组合到一个列表中。我原来的方式是这样的,
lst1 = [chr(i) for i in range(97,123)]
lst2 = [chr(i) for i in range(65,91)]
lst = lst1+lst2
但是我认为必须有其他方法可以很好地在一行中完成此操作,然后我将它与itertools模块一起使用了
lst = [chr(i) for i in itertools.chain(range(97,123),range(65,91))]
最后,我还想到了元组拆包,
lst = [chr(i) for i in (*range(97,*range(65,91))]
Itertools与其他两种方法相比要慢一些(元组拆解是最快的方法)
例如,第一个范围和第二个范围内的字符组成了列表
>>> lst1
['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
>>> lst2
['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
我希望它们仅与1个迭代器合并,而不要与两个单独的迭代器合并。下面给出了合并列表的示例,其中使用了2个不同的值范围,
>>> lst
['a','z','A','Z']
有什么方法可以改善这一点或更改设计吗?
解决方法
您找到了正确的解决方案。
注意:itertools.chain
可能会稍微慢一些,但它的优点是(有效)零内存开销,我一般建议您这样做。 range
已经(有效)为零内存开销,因此与chain
一起使用意味着完全没有有意义的内存开销,而对tuple
进行拆包则需要同时实现两个range
作为tuple
的原因没有任何道理。如果大小从不增加,那么无论如何,但是如果输入的长度可能可变,则chain
比在内存中实现无限的可迭代性更为安全。
当然,对于您的特定情况,显而易见的解决方案(可读性更高)是:
import string
lst = list(string.ascii_letters)
,
这可能不像从软件包string
中提取的列表那样整洁,但是它确实通过将两个集合的并集创建一个可迭代的对象来解决了您的问题,并且效率也很高。
>>> [chr(i) for i in set(range(97,123)).union(range(65,91))]
['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。