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具有线性复杂性。因此,对于大型列表来说,这种变化会较慢。