2017-01-07 4 views
1

У меня есть список объектов, и у каждого объекта есть внутри него список других типов объектов. Я хочу извлечь эти списки и создать новый список другого объекта.Python: Сгладить список объектов

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 flatten список списка не помог, так как я получил список списков другого объекта.

+0

Пробовали ли вы [это] (https://docs.python.org/3/library/itertools.html#itertools.chain. from_iterable)? – torkleyy

+0

@ User9182736455 да, но я не знал, как реализовать его для списка объектов, каждый из которых содержит список других oject .... –

+2

Возможный дубликат [Создание плоского списка из списка списков в Python] (http : //stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python) – jszakmeister

ответ

3

использование 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] 
+1

В качестве альтернативы вы можете использовать 'chain.from_iterable', чтобы распаковка не требовалась: 'itertools.chain.from_iterable (x.myList для x в List1)' – niemmi

-1

Не совсем ракетостроение:

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

list.extend() возвращает None, а не список. Вы должны использовать конкатенацию в вашем лямбда-функции, так что результат вызова функции список:

bigList = reduce(lambda x, y: x + y.myList, List1, []) 

Хотя это выполнимо с reduce(), используя список понимание будет быстрее и более вещий:

bigList = [x for obj in List1 for x in obj.myList] 
Смежные вопросы