如何合并两个列表python

How to merge two lists python

我已经知道,如果我们有两个元组的列表,比如:

1
list = (('2', '23', '29', '26'), ('36', '0'))

通过以下命令:

1
new_list = list[0] + list[1]

它将是;

1
list = ('2', '23', '29', '26', '36', '0')

如果下面有很多元组,我想使用类似于loop的命令,我该怎么做?

1
list = [[list], [list2], [list3], ...]

我想要:

1
new_list = [list1, list2, list3,...]


使用itertools.chain,您只需使用*将列表作为参数提供即可扩展它们。

1
2
3
4
5
6
>>> from itertools import chain
>>> a_list = [[1], [2], [3]]
>>> list(chain(*a_list))
[1, 2, 3]
>>> tuple(chain(*a_list))
(1, 2, 3)

也不要使用诸如list之类的预定义类型作为变量名,因为这样会将它们重新定义为不真实的类型,并且括号(1, 2...)语法会导致tuple而不是list语法。


首先,您没有像您在问题中所说的那样合并两个列表。你要做的就是把一张单子列成一张单子。

有很多方法可以做到这一点。除了其他答案中列出的方法外,一种可能的解决方案是:

1
2
3
4
for i in range(0, len(list_of_list)):
    item = list_of_list[i]
    for j in range(0,len(item)):
        new_list = new_list + [item]

注意:这个解决方案通常被标记为C类,因为它不使用任何Python方法。


1
2
3
>>> main_list = [[1,2,3],[4,5,6,7],[8,9]]
>>> [item for sublist in main_list for item in sublist]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

这将使用嵌套的列表理解方法。这里可以找到如何阅读它们的很好的解释。

想想你怎么用常规的循环。一个外部循环将提取一个列表,一个内部循环将列表中的每个元素附加到结果中。

1
2
3
4
5
6
7
>>> newlist = []
>>> for sublist in main_list:
        for item in sublist:
            newlist.append(item)

>>> newlist
[1, 2, 3, 4, 5, 6, 7, 8, 9]

同样,在上面的嵌套列表理解中,for sublist in main_list提取一个子列表,for item in sublist在每个项目上循环,并且在理解开始时item对最终结果自动执行list.append(item)。与常规循环最大的区别是,您希望自动附加到最终结果的内容放在开头。


在这种情况下,列表中的所有条目都是整数,因此很容易使用regular expressions。在这里使用正则表达式的额外好处是,它可以处理任意嵌套列表与链表,当列表为more than 1 degree nested时,链表不起作用。

1
2
3
4
import re
alist = [[1], [2],[3]]
results = [int(i) for i in re.findall('\d+', (str(alist)))]
print(results)

输出为;

1
>>> [1,2,4]

因此,如果我们得到一个ugly任意嵌套的列表,比如:

1
a_list = [[1], [2], [3], [1,2,3[2,4,4], [0]], [8,3]]

我们可以做到;

1
2
3
a_list = [[1], [2], [3], [1,2,3, [2,4,4], [0]], [8,3]]
results = [int(i) for i in re.findall('\d+', (str(a_list)))]
print(results)

输出为:

1
>>> [1, 2, 3, 1, 2, 3, 2, 4, 4, 0, 8, 3]

这可以说更有帮助。


一个简单的方法是使用reduce内置方法。

1
2
3
>>> list_vals = (('2', '23', '29', '26'), ('36', '0'))
>>> reduce(lambda x, y: x + y, list_vals)
('2', '23', '29', '26', '36', '0')

使用sum()

1
2
3
4
>>> tp = ( ('2', '23', '29', '26'), ('36', '0'), ('4', '2') )
>>> newtp = sum(tp, () )
>>> newtp
('2', '23', '29', '26', '36', '0', '4', '2')

itertools

1
2
3
4
5
>>> from itertools import chain
>>> tp = ( ('2', '23', '29', '26'), ('36', '0'), ('4', '2') )
>>> newtp = tuple( chain(*tp) )
>>> newtp
('2', '23', '29', '26', '36', '0', '4', '2')

或者理解,

1
2
3
4
>>> tp = ( ('2', '23', '29', '26'), ('36', '0'), ('4', '2') )
>>> newtp = tuple(i for subtp in tp for i in subtp)
>>> newtp
('2', '23', '29', '26', '36', '0', '4', '2')