[英]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)與發電機,我還沒有測試)。 for
將使您的代碼真正更快(O(n)),這取決於data
的大小可能真的很重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.