Python:展平对象列表

Her*_*fan 2 python list python-2.7 flatmap

我有一个对象列表,每个对象内部都有一个其他对象类型的列表。我想提取这些列表并创建另一个对象的新列表。

List1:[Obj1, Obj2, Obj3]

Obj1.myList = [O1, O2, O3]
Obj2.myList = [O4, O5, O6]
Obj3.myList = [O7, O8, O9]
Run Code Online (Sandbox Code Playgroud)

我需要这个:

L = [O1, O2, O3, O4, ...., O9];

我试过了extend()reduce()但没有用

bigList = reduce(lambda acc, slice: acc.extend(slice.coresetPoints.points), self.stack, [])
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

寻找 python flatten 列表列表没有帮助,因为我得到了其他对象的列表列表。

Jea*_*bre 6

使用itertools.chain(或者甚至在这种情况下更好,itertools.chain.from_iterable正如 niemmi 指出的那样)避免创建临时列表和使用extend

import itertools
print(list(itertools.chain(*(x.myList for x in List1))))
Run Code Online (Sandbox Code Playgroud)

或(更清晰,速度稍快):

print(list(itertools.chain.from_iterable(x.myList for x in List1)))
Run Code Online (Sandbox Code Playgroud)

小型可复制测试:

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)))
Run Code Online (Sandbox Code Playgroud)

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

(扁平化列表的所有食谱:如何从列表中制作出扁平化的列表?