克隆列表的元素

Vel*_*les 3 python

假设我有一个如下所示的Python列表:

list = [ a, b, c, d]
Run Code Online (Sandbox Code Playgroud)

我正在寻找最有效的方式来获得这个:

list = [ a, a, a, a, b, b, b, c, c, d ]
Run Code Online (Sandbox Code Playgroud)

因此,如果列表长度为N个元素,则第一个元素被克隆N-1次,第二个元素被克隆N-2次,依此类推......最后一个元素被克隆NN次或0次.有关如何在大型列表上有效执行此操作的任何建议.

aar*_*ing 5

请注意,我正在测试速度,而不是正确性.如果有人想在单元测试中编辑,我会解决它.

pyfunc_fastest: 152.58769989 usecs
pyfunc_local_extend: 154.679298401 usecs
pyfunc_iadd: 158.183312416 usecs
pyfunc_xrange: 162.234091759 usecs
pyfunc: 166.495800018 usecs
Ignacio: 238.87629509 usecs
Ishpeck: 311.713695526 usecs
FabrizioM: 456.708812714 usecs
JohnKugleman: 519.239497185 usecs
Bwmat: 1309.29429531 usecs
Run Code Online (Sandbox Code Playgroud)

在这里测试代码.第二次修订是垃圾,因为我急于让我的第一批测试后发布的每个人都经过测试.这些时间是代码的第五次修订.

这是我能够获得的最快版本.

def pyfunc_fastest(x):
    t = []
    lenList = len(x)
    extend = t.extend
    for l in xrange(0, lenList):
        extend([x[l]] * (lenList - l))
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我修改了一个版本,以避免使用enumerate比原始版本慢的内容索引到列表中.