簡體   English   中英

在清單理解中添加其他項目

[英]Add extra items in list comprehension

我有這樣的清單:

a = ['orange', 'apple', 'banana']

然后我用一個簡單的列表推導建立另一個元組列表

b = [(key, key.upper()) for key in a]

結果是這樣的:

b = [('orange', 'ORANGE'), ('apple', 'APPLE'), ('banana', 'BANANA')]

現在,我需要在新生成的b列表的開頭(例如,末尾)插入另一個元組: ('---', None)

兩種簡單的解決方案是:

# Solution 1
b = [('---', None)] + b

# Solution 2 
b.insert(0, ('---', None))

題:
有沒有一種方法可以直接從列表理解構造中完成相同的事情?
這樣的東西(偽代碼)可以在python中實現嗎?

b = [('---', None), (key, key.upper()) for key in a]

是的,通過使用生成器理解:

b = [('---', None), *((key, key.upper()) for key in a)]

而不是使用一個發電機理解的,你也可以使用列表理解。 使用生成器理解的好處是它們不創建新列表,而是逐一分發項目。 如果您的列表( a )很大,則可能會影響內存使用和/或性能。

使用星號(“ splat運算符”)解包此類序列的方法是PEP 448 —其他解包概述 它使您不僅可以在函數調用中使用* ,還可以在列表,生成器和設置推導中使用* (對**和字典推導也是如此)。

過早的優化是萬惡之源

您確定的操作很可能不是您的瓶頸。 使用允許您使用一個表達式的巧妙的列表理解方法並不能解決與性能有關的問題。 以下是在列表中包含3mio項的演示。

如果您需要重復將項目添加到左側的列表中,建議您使用collections.deque 請注意, dequeappendleft具有O(1)復雜度,而列表對insert(0, value)具有O(n)性能。

from collections import deque

a = ['orange', 'apple', 'banana']*1000000

def l3v(a):
    return [('---', None), *((key, key.upper()) for key in a)]

def jpp(a):
    b = deque([(key, key.upper()) for key in a])
    b.appendleft(('---', None))
    return list(b)

def original(a):
    return [('---', None)] + [(key, key.upper()) for key in a]

def original2(a):
    b = [(key, key.upper()) for key in a]
    b.insert(0, ('---', None))
    return b

%timeit l3v(a)        # 1.35 s per loop
%timeit jpp(a)        # 1.23 s per loop
%timeit original(a)   # 1.17 s per loop
%timeit original2(a)  # 1.14 s per loop

如果不是,請嘗試使用列表理解。 像下面

b = [(a[i],a[i].upper()) if i < len(a) else ('---',None)  for i in range(len(a)+1)]

希望能幫助到你。

快樂編碼:)

暫無
暫無

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

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