18

我想要一个长列表,例如 [1,2,3,4,5,15,16,17,18,19]。为了初始化它,我尝试输入:

new_list = [range(1,6),range(15,20)]

然而,这并没有做我想要的,返回:

[[1, 2, 3, 4, 5], [15, 16, 17, 18, 19]]

当我做:

len(new_list)

它返回 2,而不是我想要的 10 个元素(因为它在列表中创建了 2 个列表)。显然,在这个例子中,我可以只输入我想要的内容,但我正在尝试对一些奇怪的迭代列表执行此操作,例如:

new_list = [range(101,6284),8001,8003,8010,range(10000,12322)]

需要一维列表而不是列表列表(或最好的名称)。我猜这真的很容易而且我很想念它,但是经过相当多的搜索后,我没有想出任何有用的东西。有任何想法吗?

4

8 回答 8

34

在 Python 2.x 上试试这个:

 range(1,6) + range(15,20)

或者,如果您使用的是 Python3.x,请尝试以下操作:

list(range(1,6)) + list(range(15,20))

对于处理中间元素,对于 Python 2.x:

range(101,6284) + [8001,8003,8010] + range(10000,12322)

最后用于处理中间元素,对于 Python 3.x:

list(range(101,6284)) + [8001,8003,8010] + list(range(10000,12322))

这里要记住的关键方面是,在 Python 2.x 中range返回一个列表,而在 Python 3.x 中它返回一个可迭代对象(因此需要将其显式转换为列表)。对于将列表附加在一起,您可以使用+运算符。

于 2012-12-19T19:18:47.167 回答
9

您可以使用itertools.chain来展平range()调用的输出。

import itertools
new_list = list(itertools.chain(xrange(1,6), xrange(15,20)))

使用xrange(或仅range()用于 python3)获取可迭代并将它们链接在一起意味着只创建一个列表对象(不需要中间列表)。

如果您需要插入中间值,只需在链中包含一个列表/元组:

new_list = list(itertools.chain((-3,-1), 
                                xrange(1,6), 
                                tuple(7),  # make single element iterable
                                xrange(15,20)))
于 2012-12-19T19:18:24.127 回答
3

range返回一个列表开头,因此您需要将它们连接在一起+或使用append()or extend()

new_list = range(1,6) + range(15,20)

或者

new_list = range(101,6284)
mew_list.extend([8001,8003,8010])
mew_list.extend(range(10000,12322))

或者,您可以itertools.chain()按照 Shawn Chin 的回答中所示使用。

于 2012-12-19T19:17:18.810 回答
2

只需range按如下方式解压缩值:

new_list = [*range(1,6), *range(15,20)]

print(new_list)
# [1, 2, 3, 4, 5, 15, 16, 17, 18, 19]

print(len(new_list))
# 10

print(type(new_list))
# <class 'list'>
于 2020-09-13T17:47:39.820 回答
1

尝试这个:

from itertools import chain

new_list = [x for x in chain(range(1,6), range(15,20))]
print new_list

像你想要的那样输出:

[1、2、3、4、5、15、16、17、18、19]
于 2012-12-19T19:20:24.720 回答
0

我想建议没有 + 的 ua 版本

import operator
a = list(range(1,6))
b = list(range(7,9))
print(operator.concat(a,b))
于 2012-12-20T15:18:44.127 回答
0

只需按如下方式解压缩范围值:

>>> new_list = [*range(1,6),*range(15,20)]
>>> new_list
[1, 2, 3, 4, 5, 15, 16, 17, 18, 19]
>>> len(new_list)
10
于 2020-09-13T17:42:42.723 回答
0

您可以使用itertools.chain函数和解包运算符 (*)

示例 1:

from itertools import chain

output = [*chain(range(1, 6), range(15, 20))]

示例 2:

from itertools import chain

data = [range(1, 6), range(15, 20)]
output = [*chain(*data)]

示例 3 使用chain.fromiterable

data = [range(1, 6), range(15, 20)]
output = [*chain.from_iterable(data)]

输出

assert output == [1, 2, 3, 4, 5, 15, 16, 17, 18, 19]
于 2021-10-13T19:20:20.717 回答