在列表之间插入的最有效方法?

Cia*_*arz 5 python list list-manipulation

我正在读取一个文件并构建一个列表a2。我想在前两项之后插入 3 行以a2从列表中列出。b

b = ["This is a line", "another line", "and another one"]
a2 = ['a1', 'a2', 'a3']

i = 0
for x, y in map(None, a2[0:2], a2):
    i = i + 1
    if x == y:
        continue
    else:
        for newLine in b:
            a2.insert(i-1, newLine)
            i = i+1
print a2
Run Code Online (Sandbox Code Playgroud)

上面确实给了我预期的结果['a1', 'a2', 'This is a line', 'another line', 'and another one', 'a3'],但由于我要从巨大的文本文件中构建列表并在之间插入几行,我想我必须使其性能更加直观!

Ana*_*mar 4

怎么样 -

a2[2:2] = b
Run Code Online (Sandbox Code Playgroud)

演示 -

>>> b = ["This is a line", "another line", "and another one"]
>>> a2 = ['a1', 'a2', 'a3']
>>> a2[2:2] = b
>>> a2
['a1', 'a2', 'This is a line', 'another line', 'and another one', 'a3']
Run Code Online (Sandbox Code Playgroud)

我所知道的一些方法的计时信息(包括OP发布的方法)-

def func1():
    b = ["This is a line", "another line", "and another one"]
    a2 = ['a1', 'a2', 'a3']
    i = 0
    for x, y in map(None, a2[0:2], a2):
        i = i + 1
        if x == y:
            continue
        else:
            for newLine in b:
                a2.insert(i-1, newLine)
                i = i+1
    return a2


def func2():
    b = ["This is a line", "another line", "and another one"]
    a2 = ['a1', 'a2', 'a3']
    a2 = a2[:2] + b + a2[2:]
    return a2

def func3():
    b = ["This is a line", "another line", "and another one"]
    a2 = ['a1', 'a2', 'a3']
    a2[2:2] = b
    return a2


import timeit

print timeit.timeit(func1,number=500000)
print timeit.timeit(func2,number=500000)
print timeit.timeit(func3,number=500000)
Run Code Online (Sandbox Code Playgroud)

结果 -

1.81288409233
0.621006011963
0.341125011444
Run Code Online (Sandbox Code Playgroud)

a具有 100000 个元素和具有 1000 个元素的时序结果b-

def func1():
    global a2
    global b
    i = 0
    for x, y in map(None, a2[0:2], a2):
        i = i + 1
        if x == y:
            continue
        else:
            for newLine in b:
                a2.insert(i-1, newLine)
                i = i+1
            break
    return a2


def func2():
    global a2
    global b
    a2 = a2[:2] + b + a2[2:]
    return a2

def func3():
    global a2
    global b
    a2[2:2] = b
    return a2

def func4():
    global a2
    global b
    a2.reverse()
    b.reverse()
    for i in b:
        a2.insert(-2, i)
    return a2

import timeit

a2 = ['a1' for _ in range(100000)]
b = ['a2' for i in range(1000)]

print timeit.timeit(func1,number=10,setup = 'from __main__ import a2,b')
print timeit.timeit(func2,number=10,setup = 'from __main__ import a2,b')
print timeit.timeit(func3,number=10,setup = 'from __main__ import a2,b')
print timeit.timeit(func4,number=10,setup = 'from __main__ import a2,b')
Run Code Online (Sandbox Code Playgroud)

结果 -

1.00535297394
0.0210499763489
0.001296043396
0.0044310092926
Run Code Online (Sandbox Code Playgroud)

参考时序测试 - https://ideone.com/k4DANI