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, [])
P.S.
寻找 python 展平列表列表没有帮助,因为我得到了其他对象列表的列表。
不完全是火箭科学:
L = []
for obj in List1:
L.extend(obj.myList)
使用 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]
(扁平化列表列表的所有方法:How to make a flat list out of list of lists?)
list.extend()
returns None
,不是列表。您需要在 lambda 函数中使用连接,以便函数调用的结果是一个列表:
bigList = reduce(lambda x, y: x + y.myList, List1, [])
虽然这在 reduce()
中是可行的,但使用列表推导式会更快并且更符合 pythonic:
bigList = [x for obj in List1 for x in obj.myList]
你可以用一行 list comprehension
:
[i for obj in List1 for i in obj.myList]
我有一个对象列表,每个对象里面都有一个其他对象类型的列表。我想提取这些列表并创建另一个对象的新列表。
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 展平列表列表没有帮助,因为我得到了其他对象列表的列表。
不完全是火箭科学:
L = []
for obj in List1:
L.extend(obj.myList)
使用 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]
(扁平化列表列表的所有方法:How to make a flat list out of list of lists?)
list.extend()
returns None
,不是列表。您需要在 lambda 函数中使用连接,以便函数调用的结果是一个列表:
bigList = reduce(lambda x, y: x + y.myList, List1, [])
虽然这在 reduce()
中是可行的,但使用列表推导式会更快并且更符合 pythonic:
bigList = [x for obj in List1 for x in obj.myList]
你可以用一行 list comprehension
:
[i for obj in List1 for i in obj.myList]