在Python中,从列表A或B中为每个索引随机选择1个元素

在Python中,从列表A或B中为每个索引随机选择1个元素,python,list,random,Python,List,Random,我有两个Python列表,我想为每个索引选择列表A或列表B中的一个元素。 我很容易就做到了,但是这个解决方案的性能很差,而且看起来不太优雅。 有谁能建议一个不依赖于的周期的替代方案,如果在 我将在这里发布代码: def scramble(list1, list2): finalList = [] for i in range(32): # the list has 32 elements if randint(1,2) == 1: fina

我有两个Python列表,我想为每个索引选择列表A或列表B中的一个元素。 我很容易就做到了,但是这个解决方案的性能很差,而且看起来不太优雅。
有谁能建议一个不依赖于周期的替代方案,如果

我将在这里发布代码:

def scramble(list1, list2):
    finalList = []
    for i in range(32): # the list has 32 elements
        if randint(1,2) == 1:
            finalList.append(list1[i])
        else:
            finalList.append(list2[i])
    return finalList
那么:

def scramble(list1, list2):
    return [random.choice([list1[i], list2[i]]) for i in range(len(list1))]

它假定len(list1)=len(list2)。但我不确定这是否一定会更快。

您可以在一个列表中这样做:

newList = [x if randint(0,1) else y for x, y in zip(l1, l2)]
我不确定这是否真的能大大提高性能,但这很简单。

您可以使用“聪明”的列表理解:

from random import choice

def scramble(l1,l2):
    length = min(len(l1),len(l2))
    lists = (l1,l2)
    return [choice(lists[i]) for i in xrange(0,length)]

虽然可读性较差。

不错。但是它是更快,还是更好看?嗯,看起来是这样的。我对Python完全陌生,所以我将测试它并让您知道。谢谢@战斗戴夫:我刚刚计时,我的版本对于两个分别包含1e6个整数的列表来说大约快了3倍。好吧,它可以工作!速度大约是原来的2倍。非常感谢。只有一件事。由于列表1和列表2的大小始终相同,我是否应该使用zip()而不是izip()?@jbssm:
izip
的行为与长度不等的列表上的
zip
的行为完全相同,即,这不应影响您的决定。然而,
izip
在这里效率更高,因为它不会在内存中创建完整的对列表,而是一个接一个地创建对。嗯,它看起来更漂亮,但需要相同的时间。嗨,马克。我认为这将花费大约相同的时间,也许会少一点,因为for循环仍然存在,尽管它在比较中被删除。@jbssm-我做了一些分析,并相应地更改了代码。这个版本看起来比mhyfritz的要快,但我投了他的票,因为它更优雅,我得到的主要性能提升是使用choice,而不是randint。如果您感兴趣,我可以将分析结果添加到答案中。谢谢Mark。我也会保留这个答案。
from random import choice

def scramble(l1,l2):
    length = min(len(l1),len(l2))
    lists = (l1,l2)
    return [choice(lists[i]) for i in xrange(0,length)]