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

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

2
Hertha BSC fan 7 Янв 2017 в 15:27

4 ответа

Лучший ответ

Используя itertools.chain (или даже лучше в этом случае 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]

(все рецепты, чтобы свести список списков: Как сделать плоский список из списка списков?)

5
Jean-François Fabre 20 Дек 2019 в 08:50

Это можно сделать с помощью одной строки list comprehension :

[i for obj in List1 for i in obj.myList]
3
ettanany 7 Янв 2017 в 12:52

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

L = []
for obj in List1:
    L.extend(obj.myList)
-1
Duncan 7 Янв 2017 в 12:33

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

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

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

bigList = [x for obj in List1 for x in obj.myList]
0
Eugene Yarmash 7 Янв 2017 в 13:06