我喜欢可能的最简单的解决方案(包括效率)。解决方案是否如此并不总是很清楚。无论如何,range()
Python 3 中的 是一个生成器。您可以将其包装到任何进行迭代的构造中。list()
能够从任何可迭代对象构造列表值。列表的+
运算符进行连接。我在示例中使用了较小的值:
>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(10, 20))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> list(range(5)) + list(range(10,20))
[0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
这range(5) + range(10, 20)
正是 Python 2.5 中所做的——因为range()
返回了一个列表。
在 Python 3 中,它仅在您真的想要构造列表时才有用。否则,我推荐使用itertools.chain的Lev Levitsky 的解决方案。该文档还显示了非常简单的实现:
def chain(*iterables):
# chain('ABC', 'DEF') --> A B C D E F
for it in iterables:
for element in it:
yield element
Inbar Rose的解决方案很好,功能也相当。无论如何,我的 +1 是给 Lev Levitsky 和他关于使用标准库的论点。来自Python 之禅...
面对模棱两可,拒绝猜测的诱惑。
#!python3
import timeit
number = 10000
t = timeit.timeit('''\
for i in itertools.chain(range(30), range(2000, 5002)):
pass
''',
'import itertools', number=number)
print('itertools:', t/number * 1000000, 'microsec/one execution')
t = timeit.timeit('''\
for x in (i for j in (range(30), range(2000, 5002)) for i in j):
pass
''', number=number)
print('generator expression:', t/number * 1000000, 'microsec/one execution')
在我看来,itertools.chain
它更具可读性。但真正重要的是...
itertools: 264.4522138986938 microsec/one execution
generator expression: 785.3081048010291 microsec/one execution
...速度快了大约 3 倍。