[英]Python: Flatten a list of Objects
我有一個對象列表,每個對象內部都有一個其他對象類型的列表。 我想提取這些列表並創建另一個對象的新列表。
List1:[Obj1, Obj2, Obj3]
Obj1.myList = [O1, O2, O3]
Obj2.myList = [O4, O5, O6]
Obj3.myList = [O7, O8, O9]
我需要這個:
L = [O1, O2, O3, O4, ...., O9];
我嘗試了extend()
和reduce()
但沒有用
bigList = reduce(lambda acc, slice: acc.extend(slice.coresetPoints.points), self.stack, [])
聚苯乙烯
尋找 python flatten 列表列表沒有幫助,因為我得到了其他對象的列表列表。
使用itertools.chain
(或者甚至更好,在這種情況下itertools.chain.from_iterable
正如 niemmi 指出的那樣)避免創建臨時列表和使用extend
import itertools
print(list(itertools.chain(*(x.myList for x in List1))))
或(更清晰,速度稍快):
print(list(itertools.chain.from_iterable(x.myList for x in List1)))
小型可復制測試:
class O:
def __init__(self):
pass
Obj1,Obj2,Obj3 = [O() for _ in range(3)]
List1 = [Obj1, Obj2, Obj3]
Obj1.myList = [1, 2, 3]
Obj2.myList = [4, 5, 6]
Obj3.myList = [7, 8, 9]
import itertools
print(list(itertools.chain.from_iterable(x.myList for x in List1)))
結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
(扁平化列表的所有食譜: 如何從列表中制作出扁平化的列表? )
您可以通過單行list comprehension
來實現:
[i for obj in List1 for i in obj.myList]
list.extend()
返回None
,而不是列表。 您需要在 lambda 函數中使用連接,以便函數調用的結果是一個列表:
bigList = reduce(lambda x, y: x + y.myList, List1, [])
雖然這對reduce()
是可行的,但使用列表推導會更快,更pythonic:
bigList = [x for obj in List1 for x in obj.myList]
不完全是火箭科學:
L = []
for obj in List1:
L.extend(obj.myList)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.