在列表内定义列表范围

Led*_*Led 14 python

在python中有一种创建列表的方法,该列表将跳过数字并在跳过后继续?类似于以下代码:

x = [1...3, 6...10]
print(x)
# [1,2,3,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

好吧,它很容易编写for循环,然后跳过每个定义的索引/值,或者我只能使用range,我正在寻找的是一条较短的可读性更高的行。如果没有,我可以理解。

Olv*_*ght 15

最简单的方法是调用range()并在列表分配中解压缩结果。

x = [*range(1, 4), *range(6, 11)]
Run Code Online (Sandbox Code Playgroud)

  • 尽管此方法有效,但值得注意的是,这会在内存中创建整个列表。如果只想遍历结果序列一次,那么它将比`itertools.chain`方法消耗更多的内存。确切地说,我的系统上每个数字40个字节。对于小序列来说这很好,但是,如果您的序列有十亿个数字,那么您可以算一下... (3认同)
  • @Led,[解包参数](https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists) (2认同)

Net*_*ave 14

另外,您可以使用itertools.chain

>>> import itertools
>>> list(itertools.chain(range(1, 5), range(20, 25)))
[1, 2, 3, 4, 20, 21, 22, 23, 24]
Run Code Online (Sandbox Code Playgroud)

  • @ led,itertools是python附带的功能最强大的库之一,它尽可能地原生。否则,开箱的正税也很方便。 (4认同)
  • @Led Importing是您的朋友。早点学习,而不是晚一点。 (4认同)
  • @Led为什么必须从标准库中导入呢?它是Python的一部分 (2认同)

yat*_*atu 5

如果numpy是一个选项,则可以np.r_用来连接切片对象:

import numpy as np
np.r_[range(1,4), range(6,11)]
# array([ 1,  2,  3,  6,  7,  8,  9, 10])
Run Code Online (Sandbox Code Playgroud)