簡體   English   中英

列表理解的多重分配

[英]Multiple assignation with list comprehension

我想知道是否可以通過一個列表理解來分配多個列表。 我以某種方式無法理解語法。

所以,不要做...

xs = [item.km for item in data]
ys = [item.price for item in data]

我想做...

xs, ys = [km, price for km, price in data]
# or...
xs, ys = [item.km, item.price for item in data]

但這會引發語法錯誤,而且我似乎找不到該錯誤。

即使看起來很明顯,數據也如下...

for elem in data:
    print elem
# outputs (this is a namedtuple) :
# mileage(km=22899.0, price=7990.0)
# mileage(km=48235.0, price=6900.0)
# mileage(km=54000.0, price=7990.0)
# mileage(km=60949.0, price=7490.0)
...

如果我正確理解您的結構,則需要帶星號的zip()來轉置數據:

xs, ys = zip(*[(km, price) for km, price in data]) 

單個列表理解產生單個列表。 您嘗試使用多重分配將結構[(a,b), (a,b), (a,b)]分配給兩個變量,但這不起作用,因為條目數不匹配。 您可以改為生成對組件的列表:

kms = [item.km for item in data]
prices = [item.price for item in data]

但這確實會兩次處理列表data 如果真的要避免這種情況很重要,我們可以並行構建兩個列表,但這仍然不是一個完整的理解:

kms, prices = [], []
for item in data:
    kms.append(item.km)
    prices.append(item.price)

通過預分配列表,可以減輕內存管理器的負擔:

kms, prices = [None]*len(data), [None]*len(data)
for i,item in enumerate(data):
    kms[i]=item.km
    prices[i]=item.price

但是最有可能的情況是,最好使用numpy或pandas聯合處理數據。

可以使用fold來產生兩個列表,並從一個理解中獲得輸入,但是在常見的Python實現中既復雜又效率低下。

就像其他人已經指出的那樣,簡單的答案是: 列表理解產生單個列表

但是,您可以按照@Chris_Rands的建議,使用zip轉換數據。 我會對其進行調整,並使用生成器使其更快一些。

xs, ys = zip(*((item.km, item.price) for item in data))

問題在於,上面的代碼將對數據集進行多次迭代,以產生所需的結果。 由於Yann的答案指出(使用答案甚至更好),因此使用平原for迭代的效果要好得多:

xs, ys = [], []
for item in data:
    xs.append(item.km)
    ys.append(item.price)

有時我們需要犧牲一些東西來提高性能。 在這種情況下:

  • zip是一個很棒的工具,但它並不完全適用於此。 這片段是不是人們不知道用例的簡單易讀,而且也慢(O(2 * N ^ 2)或可能為O(n ^ 2)與發電機,我還沒有測試)。
  • 使用plain for將使您的代碼真正更快(O(n)),這取決於data的大小可能真的很重要。

暫無
暫無

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

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