Joh*_*ooy 56

[j for i in zip(a,b) for j in i]
Run Code Online (Sandbox Code Playgroud)

  • 一开始看起来很奇怪:)明智地切掉第一个`for`并将其移到最后,然后读到:`for zip in a(b,`)`,`for j in i`,`j `. (20认同)
  • 整洁,但如果一个列表比另一个列表短1个元素(仍然应该能够合并),则不起作用. (5认同)
  • [j for i in i for i in zip(a,b)]虽然更容易解析在我脑海中不起作用! (4认同)

Mar*_*ers 26

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

from itertools import chain
c = list(chain(*zip(a,b)))
Run Code Online (Sandbox Code Playgroud)

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

c = a + b
Run Code Online (Sandbox Code Playgroud)


Joh*_*hin 22

解析

[j for i in zip(a,b) for j in i]
Run Code Online (Sandbox Code Playgroud)

如果你记得forand和if条款是按顺序完成的,那么在你的脑海里很容易,最后追加结果:

temp = []
for i in zip(a, b):
    for j in i:
        temp.append(j)
Run Code Online (Sandbox Code Playgroud)

如果用更有意义的变量名称编写它会更容易:

[item for pair in zip(a, b) for item in pair]
Run Code Online (Sandbox Code Playgroud)


小智 5

使用索引切片的另一种方法是比zip更快并且扩展性更好:

def slicezip(a, b):
    result = [0]*(len(a)+len(b))
    result[::2] = a
    result[1::2] = b
    return result
Run Code Online (Sandbox Code Playgroud)

你会注意到这只有在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
Run Code Online (Sandbox Code Playgroud)