Python 如何通过在元素前加前缀使列表大小相同

Python 如何通过在元素前加前缀使列表大小相同,python,list,Python,List,我有一个列表,看起来像这样: [ [12, 4, 6], [55], [102, 7, 7, 2] ] 用0元素作为前缀使其大小相同的最佳方法是什么。预期成果: [ [0, 12, 4, 6], [0, 0, 0, 55], [102, 7, 7, 2] ] 您可以使用: m = max(map(len, l)) l = [[0] * (m - len(i)) + i for i in l ] l # [[0, 12, 4, 6], [0, 0, 0, 55], [

我有一个列表,看起来像这样:

[
  [12, 4, 6],
  [55],
  [102, 7, 7, 2]
]
用0元素作为前缀使其大小相同的最佳方法是什么。预期成果:

[
  [0, 12, 4, 6],
  [0, 0, 0, 55],
  [102, 7, 7, 2]
]
您可以使用:

m = max(map(len, l))
l = [[0] * (m - len(i)) + i for i in l ]
l

# [[0, 12, 4, 6], [0, 0, 0, 55], [102, 7, 7, 2]]

你可以这样做:

a = [ 
  [12, 4, 6], 
  [55], 
  [102, 7, 7, 2] 
]   

my_max = max((map(len, a)))  


for i in a: 
   while len(i) < my_max : 
       i.insert(0, 0) 

a                                             
[[0, 12, 4, 6], [0, 0, 0, 55], [102, 7, 7, 2]]




以下函数将为您执行此操作。不知道它有多优雅

def padded_list(my_list):
    max_elems = max([len(i) for i in my_list])
    new_list = [[0]*(max_elems - len(i)) + i for i in my_list]
    return new_list
你可以这样做

maxLen = max(map(len, arr))
[row.extend(['0']*(maxLen - len(row))) for row in arr]

#[[12, 4, 6, '0'], [55, '0', '0', '0'], [102, 7, 7, 2]]

下面是建议的解决方案以及使用itertools的解决方案的一些性能特征

TLDR; @kederrac提出的解决方案比使用itertools的解决方案快2倍。@Beny提出的解决方案慢了60倍

如果新列表是迭代器列表而不是列表,那么使用itertools的解决方案比@Kederrac的解决方案快6倍

以下是实际数字-

mahorir@mahorir-Vostro-3446:~/Desktop$ python3 --version
Python 3.6.9
对于大型列表,对于10000次迭代-

mahorir@mahorir-Vostro-3446:~/Desktop$ python3 so-28.py 
with_iter : 1.070244312286377
with_iter_retrun_iter : 0.09145450592041016
without_iter : 0.6605610847473145
with_insert : 60.93585515022278

mahorir@mahorir-Vostro-3446:~/Desktop$ python3 so-28.py 
with_iter : 0.040375709533691406
with_iter_retrun_iter : 0.026880741119384766
without_iter : 0.01978278160095215
with_insert : 0.034635305404663086

对于10000次迭代的小列表-

mahorir@mahorir-Vostro-3446:~/Desktop$ python3 so-28.py 
with_iter : 1.070244312286377
with_iter_retrun_iter : 0.09145450592041016
without_iter : 0.6605610847473145
with_insert : 60.93585515022278

mahorir@mahorir-Vostro-3446:~/Desktop$ python3 so-28.py 
with_iter : 0.040375709533691406
with_iter_retrun_iter : 0.026880741119384766
without_iter : 0.01978278160095215
with_insert : 0.034635305404663086

代码-

import itertools as it
from timeit import time

def with_iter():
    l=[
    [12, 4, 6]*1000,
    [55],
    [102, 7, 7, 2]
    ]
    m = max(map(len, l))
    n = [list(it.chain(it.repeat(0,m-len(i)),i)) for i in l]

def with_iter_retrun_iter():
    l=[
    [12, 4, 6]*1000,
    [55],
    [102, 7, 7, 2]
    ]
    m = max(map(len, l))
    n = [(it.chain(it.repeat(0,m-len(i)),i)) for i in l]


def without_iter():
    l=[
    [12, 4, 6]*1000,
    [55],
    [102, 7, 7, 2]
    ]

    m = max(map(len, l))
    n = [[0] * (m - len(i)) + i for i in l ]

def with_insert():
    a = [ 
    [12, 4, 6]*1000, 
    [55], 
    [102, 7, 7, 2] 
    ]
    my_max = max((map(len, a)))
    for i in a: 
        while len(i) < my_max : 
            i.insert(0, 0) 

if __name__ == "__main__":
    a=time.time()
    for i in range(10000):
        with_iter()
    print("with_iter", time.time()-a, sep=" : ")

    a=time.time()
    for i in range(10000):
        with_iter_retrun_iter()
    print("with_iter_retrun_iter", time.time()-a, sep=" : ")

    a=time.time()
    for i in range(10000):
        without_iter()
    print("without_iter", time.time()-a, sep=" : ")

    a=time.time()
    for i in range(10000):
        with_insert()
    print("with_insert", time.time()-a, sep=" : ")



请注意,insert具有线性复杂性。因此,对于大型列表来说,这种变化会较慢。