2013-08-01 87 views
2

我有两个列表:Python的两个列表名单洗牌

a = [1, 2, 3, 4] 
b = [5, 6, 7, 8] 

我需要这样的:

c = [1, 5, 2, 6, 3, 7, 4, 8] 

我使用此解决方案:

c = list(reduce(lambda x, y: x + y, zip(a, b))) 

是否有更好的方法来做到这一点?

+3

如果你想得到完全的结果,那么“洗牌”不是一个得到的单词,因为它表明随机顺序。如果你想要随机订购,你的例子不是很幸运。请说明,你的意思是哪一个。 – kratenko

+0

@kratenko:你能推荐一个更好的术语来描述这种特殊的混合?我第一次尝试“合并”,但我在这里的搜索给出的答案更接近'总和'。尝试'洗牌'(如洗牌)让我在这里,这正是我所期待的。 –

回答

9

使用列表综合

>>> [x for tup in zip(a, b) for x in tup] 
[1, 5, 2, 6, 3, 7, 4, 8] 

以上嵌套列表理解为等同于下面的嵌套的循环(万一你感到困惑):

result = [] 
for tup in zip(a, b): 
    for x in tup: 
     result.append(x) 
+0

为了清楚起见,您能否添加嵌套for循环来解释这个实际工作原理。我确信有不少人说__等待...什么?__当他们第一次看到这个:) – Kimvais

+0

@Kimvais。你的意思是一般循环相当于这个? –

+1

是的。新手们需要眯起眼睛,很难弄清楚哪一个是内部的,哪一个是外部循环以及什么进入'tup' :) – Kimvais

6

使用chain

from itertools import chain, izip 
interweaved = list(chain.from_iterable(izip(a, b))) 
# [1, 5, 2, 6, 3, 7, 4, 8] 
3

Als o可行:

list(sum(zip(a, b),())) 
+0

+1好,但是比列表理解慢吗? –

+0

大概一样,即使在我的机器上也快一点。理解赢得更大的名单。 –