Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Формирование вложенных в список списков из других списков по определенным правилам?

Добрый день, есть три списка
allIndex_A = [1, 2, 8, 12, 17, 21, 23, 29] allIndex_B = [3, 5, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 28, 30] allIndex_C = [4, 6, 10, 14, 16, 19, 25, 27]
нужно из них сделать список со вложенными списками, вот такой:
newList = [[1,3,4], [2,3,4], [8,9,10], [12,13,14], ...]
Первый элемент вложенного списка это первый это первый элемент списка allIndex_A. Второй элемент это первый элемент из списка allIndex_В, значение которого больше значения первого элемента из вложенного списка. Третий элемент это также первый найденный элемент из списка allIndex_С, значение которого больше первого элемента во вложенном списке.
Первый элемент второго вложенного списка это второй элемент из списка allIndex_A. Второй и третий элемент второго вложенного списка находятся по таким же условиям как и в первом вложенном списке. То есть это должен быть первый найденный элемент из списков allIndex_В и allIndex_С, значение которого больше значения первого элемента.
Пример получившегося списка newList выше. Начал изучать программирование недавно, многих вещей еще не знаю. Буду благодарен, если кто-то объяснит как сделать то, что мне нужно или хотя-бы даст ссылку где можно почитать на тему вопроса.


Ответ

Вот решение, основанное на использовании zip(), чтобы транспонировать элементы трёх списков
#!/usr/bin/env python from itertools import tee
def gt_first(first, iterable): """Yield items from iterable that are greater than corresponding items from first.
first, iterable are sorted. """ it = iter(iterable) x = next(it) #NOTE: wrap with try/except StopIteration for pep-479 for item in first: while not (x > item): x = next(it) yield x
allIndex_A = [1, 2, 8, 12, 17, 21, 23, 29] allIndex_B = [3, 5, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 28, 30] allIndex_C = [4, 6, 10, 14, 16, 19, 25, 27]
a, ab, ac = tee(allIndex_A, 3) L = list(map(list, zip(a, gt_first(ab, allIndex_B), gt_first(ac, allIndex_C)))) print(L)
Результат
[[1, 3, 4], [2, 3, 4], [8, 9, 10], [12, 13, 14], [17, 18, 19], [21, 22, 25], [23, 24, 25]]
В ответе нет вложенного списка [29, 30, None], так как allIndex_C не имеет элемента большего 29 (можно itertools.zip_longest() вместо zip() использовать, чтобы подставить какое-нибудь значение, вместо игнорирования вложенного списка целиком).
Время исполнения линейное (O(n)). Если входные списки не отсортированы, то их надо отсортировать, тогда время исполнения O(n*log n) (на сортировку).

Комментариев нет:

Отправить комментарий