簡體   English   中英

一線四聯清單

[英]Quadrupling list with one-liner

我可以用很長很丑的方式做到這一點:

list_1 = ['AA','BB']

quadrupled = []
for i in list_1:
    quadrupled.append(i)
    quadrupled.append(i)
    quadrupled.append(i)
    quadrupled.append(i)

或更短一點,使用.extend()

for i in list_1:
    quadrupled.extend([i] * 4)

但是我想知道是否可以使用列表理解來做到這一點。

quadrupled = [([i] * 4) for i in list_1]

給我列表列表,但我要平面列表。

我知道這樣的單行代碼的可讀性可能不太好,因為可能需要使用一些嵌套,並且堅持使用.extend()可能更好,但是我只是想知道是否有可能。

我已經看到相同的兩倍,而不是四倍。

您可以使用2個for循環通過列表理解來for :第一個遍歷輸入列表的元素,第二個遍歷每個元素4次。 這是我覺得很可讀的解決方案:

list_1 = ['AA','BB']

quadrupled = [i for i in list_1 for _ in range(4)]

print(quadrupled)
# ['AA', 'AA', 'AA', 'AA', 'BB', 'BB', 'BB', 'BB']

使用列表理解的另一種方法是使用zip()函數,但我發現它的可讀性較差:

quadrupled = [i for j in zip(list_1,list_1,list_1,list_1) for i in j]

實際上,在numpy中,您可以使用numpy.repeat ,例如:

import numpy as np
np.repeat(['AA','BB'],4)

的返回將是四倍的numpy數組
如果您希望將其作為列表(盡管建議使用numpy數組),則只需使用list函數將其轉換回去即可

使用itertools chain + repeat

from itertools import chain, repeat

list_1 = ['AA','BB']

res = list(chain.from_iterable(repeat(i, 4) for i in list_1))

print(res)

['AA', 'AA', 'AA', 'AA', 'BB', 'BB', 'BB', 'BB']

使用chain並從itertools repeat

>>> from itertools import chain, repeat
>>> list_1 = ['AA','BB']
>>> list(chain(*zip(*repeat(list_1, 4))))
['AA', 'AA', 'AA', 'AA', 'BB', 'BB', 'BB', 'BB']

只需與列表相乘即可

>>> list_1 = ['AA' ,'BB']
>>> list_1 = [i for i in list_1 for _ in range(4)]
>>> list_1
['AA', 'AA', 'AA', 'AA', 'BB', 'BB', 'BB', 'BB']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM