如何将两个列表合并为一个列表?

41

我有

a = [1, 2]
b = ['a', 'b']

I want

c = [1, 'a', 2, 'b']

1
@cdleary的回答https://dev59.com/7XRC5IYBdhLWcg3wG9To#408281提供了各种“在Python中展平浅列表”的方法的性能比较(展平`zip(a,b)`会给出答案)。 - jfs
9个回答

76
[j for i in zip(a,b) for j in i]

4
" [ j for j in i for i in zip(a,b) ] " 这段代码虽然在我脑海中解析起来更容易,但它并不能运行! - sureshvv
22
起初看起来有些奇怪 :) 请将第一个for之前的所有内容截断并移到最后,然后阅读:for i in zip(a, b), for j in i, j。请注意,本文仅是翻译,不包括解释或其他内容。 - anton.burger
5
整洁,但是如果一份列表比另一份列表短了一个元素就无法运行(仍应该能够合并)。 - btk
为什么不使用列表的连接方式:result = a + b。这也是你可以阅读的! - MasterControlProgram
@Ralf,这取决于您需要的排序方式。 - John La Rooy
显示剩余2条评论

30

如果元素的顺序必须与您的示例中的顺序相匹配,那么您可以使用zipchain的组合:

from itertools import chain
c = list(chain(*zip(a,b)))

如果您不关心结果中元素的顺序,那么有一种更简单的方法:

c = a + b

1
在我的情况下使用这个:'c = a+b' --> 列表不可迭代。那么怎么办?只有链式操作才有效,请查看我的问题以了解我的问题:'http://stackoverflow.com/questions/40952892/extract-url-their-names-of-an-html-file-stored-on-disk-and-print-them-respecti' - Yannis Dran
for index, row in datas.iterrows(): textF = re.findall('{{f}}(.*?)}}', row['review']) matrixF += textFif index==3: breakfor index in matrixF: print index ,它仍在起作用,因此我认为它仍然是可迭代的? ._. - Budi Mulyo
1
有一个名为chain.from_iterable的函数:list(chain.from_iterable(zip(a, b)))-- 这是完成此操作的完美惰性方法。 - byashimov

24
解析。
[item for pair in zip(a, b) for item in pair]

如果您想起forif子句是按顺序执行的,并紧接着最终结果的追加,那么在您的头脑中就足够简单了:

temp = []
for pair in zip(a, b):
    for item in pair :
        temp.append(item )

我通常对LE非常熟悉,但这个双重循环让我感到困惑。感谢您的清晰解释。 - Jeffrey Jose

5

使用索引切片的备选方法,比zip更快且更易扩展:

def slicezip(a, b):
    result = [0]*(len(a)+len(b))
    result[::2] = a
    result[1::2] = b
    return result

你会注意到只有当len(a) == len(b)时才会起作用,但是添加条件以模拟zip将不会随着a或b的增长而扩展。与之相比:
a = range(100)
b = range(100)

%timeit [j for i in zip(a,b) for j in i]
100000 loops, best of 3: 15.4 µs per loop

%timeit list(chain(*zip(a,b)))
100000 loops, best of 3: 11.9 µs per loop

%timeit slicezip(a,b)
100000 loops, best of 3: 2.76 µs per loop

“在模拟zip时添加条件不会随着a或b的增加而扩展”这句话是什么意思? - sureshvv
我只是想说,使用zip函数时,如果一个列表比另一个列表长,那么较长的列表将被截断以与较短的列表合并。可以通过比较每个数组的长度,然后仅分配较长数组的缩短版本来实现这一点。如果数组变得更大,检查长度和截断不会花费更多时间。 - SeanM
注意:这对于偏向第一个列表的二分目的非常有效:它容忍与第二个切片相同长度或长一的情况slicezip([1,2,3],[4,5]),这意味着在这种情况下您不必处理不均匀的列表(非常好)。 - TemporalWolf

4

如果您关心顺序:

#import operator
import itertools
a = [1,2]
b = ['a','b']
#c = list(reduce(operator.add,zip(a,b))) # slow.
c = list(itertools.chain.from_iterable(zip(a,b))) # better.

print c 输出 [1, 'a', 2, 'b']


3
抱歉,我只能以英文回答您的问题。如果您需要将英文内容翻译为中文,我可以帮忙。请提供需要翻译的内容。
x = [1 , 2 , 3]
y = ["a" , "b" , "c"]

z =list(zip(x,y))
print(z)

那不会给我一个扁平的列表。 - sureshvv

0

这里是一个标准/自说明的解决方案,希望有人会觉得它有用:

a = ['a', 'b', 'c']
b = ['1', '2', '3']

c = []
for x, y in zip(a, b):
    c.append(x)
    c.append(y)

print (c)

输出:

['a', '1', 'b', '2', 'c', '3']

当然,如果需要的话,您可以更改它并对值进行操作。

0
def main():

drinks = ["Johnnie Walker", "Jose Cuervo", "Jim Beam", "Jack Daniels,"]
booze = [1, 2, 3, 4, 5]
num_drinks = []
x = 0
for i in booze:

    if x < len(drinks):

        num_drinks.append(drinks[x])
        num_drinks.append(booze[x])

        x += 1

    else:

        print(num_drinks)

return

主函数()


2
请您解释您的答案。 - Zakaria Acharki
你是在五轮之后得出这个答案的吗? - sureshvv

-3
c = []
c.extend(a)
c.extend(b)

2
期望的结果完全不同。 - vaultah
1
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - Donald Duck
如果它回答了问题并且与所有其他答案不同,为什么不支持它呢?我相信这个问题没有太多的上下文,所以任何相关的答案都是受欢迎的。 - Arvind S.P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接