Объединение n-списков кортежей при комбинации чередующихся признаков - PullRequest
0 голосов
/ 10 мая 2018

У меня есть контейнер данных, который представляет собой список списков кортежей.Минимальный размер входящего контейнера данных - это список, содержащий два подсписка, каждый из которых содержит два кортежа в форме (x, y).Максимальный размер входящих данных - это список из 100 подсписков, каждый из которых содержит 2000 кортежей в форме (x, y).Тем не менее, я пытаюсь избежать жесткого кодирования верхних границ в функцию.Обратите внимание, что число списков может варьироваться.

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

Пример 1 с двумя подсписками:

a = [[(15,1),(14,2),(13,3),(12,4),(11,5),(10,6),(9,7),(8,8),(7,9),(6,10),(5,11),(4,12),(3,13),(2,14),(1,15)],
     [(7,1),(6,2),(5,3),(4,4),(3,5),(2,6),(1,7)]]

Выводит (отформатировано для ясности):

[(15,1,7),
 (14,2,6),
 (13,3,5),
 (12,4,4),
 (11,5,3),
 (10,6,2),
 (9,7,1),
 (8,8,None),
     ...
 (1,15,None)]

Example2 с тремя подсписками:

a = [[(7,1),(6,2),(5,3),(4,4),(3,5),(2,6),(1,7)],
    [(6,1),(5,2),(4,3),(3,4),(2,5),(1,6)],
    [(10,1),(9,2),(8,3),(7,4),(6,5),(5,6),(4,7),(3,8),(2,9),(1,10)]]

Будет выводить

[(7,1,6,1,10),
(6,2,5,2,9),
(5,3,4,3,8),
(4,4,3,4,7),
(3,5,2,5,6),
(2,6,1,6,5),
(1,7,None,7,4),
(None,None,None,None,3)
    ...]

Вывод по существу имеет вид:

Для n-list> 2:

на самом деле (x sublist1 , y подсписок 2 , x подсписок 2 , y подсписок 2 , x подсписок n )

для n-list = 2:

(x подсписок 1 , y подсписок 1 , x sublist n )

Я не знаю, с чего начать - все мои попытки ни к чему не привели.Некоторые идеи о том, как подойти к нему, были бы очень полезны.

Примечание: я должен использовать только стандартные библиотеки и python 2.7

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Библиотека itertools позволит вам сделать это с генераторами.

from itertools import chain, repeat
a = ...    
longest = max(len(l) for l in a)
padded = (chain(l, repeat((None, None), longest - len(l))) for l in a[:-1])
last = chain(((x,) for x, y in a[-1]), repeat((None,), len(a[-1])))
result = [tuple(chain.from_iterable(input_tuples)) for input_tuples in zip(*chain(padded, (last,)))]

Здесь я использую repeat, чтобы повторить соответствующий набор None с для правильного числа раз. chain используется для объединения двух или более генераторов вместе.

Редактирование: немного упрощено, поскольку все кортежи имеют длину 2, и добавлен специальный состав для последнего подсписка

0 голосов
/ 10 мая 2018
a = [[(7,1),(6,2),(5,3),(4,4),(3,5),(2,6),(1,7)],
    [(6,1),(5,2),(4,3),(3,4),(2,5),(1,6)],
    [(10,1),(9,2),(8,3),(7,4),(6,5),(5,6),(4,7),(3,8),(2,9),(1,10)]]

d = [dict(x) for x in a]

keys = set([y for x in d for y in x.keys()])

res=[]
for k in keys:
    temp=[]
    for x in d:
        temp.append(x.get(k))
        temp.append(k if x.get(k) is not None else None)
    res.append(temp[:-1])
print(res)

Выход:

[[7, 1, 6, 1, 10]
[6, 2, 5, 2, 9]
[5, 3, 4, 3, 8]
[4, 4, 3, 4, 7]
[3, 5, 2, 5, 6]
[2, 6, 1, 6, 5]
[1, 7, None, None, 4]
[None, None, None, None, 3]
[None, None, None, None, 2]
[None, None, None, None, 1]]
...