Python:展平对象列表

时间:2017-01-07 12:27:36

标签: python python-2.7 list flatmap

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

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, [])

P.S。

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

4 个答案:

答案 0 :(得分:4)

使用itertools.chain(或者更确切地说,就像niemmi所说的itertools.chain.from_iterable更好),这可以避免创建临时列表并使用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]

答案 1 :(得分:3)

您可以使用单行list comprehension来实现这一目标:

[i for obj in List1 for i in obj.myList]

答案 2 :(得分:0)

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]

答案 3 :(得分:-1)

不完全是火箭科学:

L = []
for obj in List1:
    L.extend(obj.myList)