簡體   English   中英

Python:展平對象列表

[英]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.

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