Составьте список на основе условий в Python, чтобы создать уникальный список - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть два списка:

a= [0,0,0,1,1,1,3,3,3]
b= ['a','b','c','d','e','f','g','h','i']
output = [['a','b','c'],['d','e','f'],['g','h','i']]

a и b - это списки одинаковой длины.Мне нужен выходной массив таким образом, чтобы всякий раз, когда значение в списке - изменялось с 0 на 1 или с 1 на 3, в списке вывода должен быть создан новый список.Может кто-нибудь, пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Поскольку вы добавили тег алгоритм , я считаю, что вам нужно решение без такого большого количества магии.

>>> def merge_lists(A, B):
...     output = []
...     sub_list = []
...     current = A[0]
...     for i in range(len(A)):
...         if A[i] == current:
...             sub_list.append(B[i])
...         else:
...             output.append(sub_list)
...             sub_list = []
...             sub_list.append(B[i])
...             current = A[i]
...     output.append(sub_list)
...     return output
... 
>>> a= [0,0,0,1,1,1,3,3,3]
>>> b= ['a','b','c','d','e','f','g','h','i']
>>> merge_list(a, b)
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
0 голосов
/ 29 ноября 2018

Используя groupby, вы можете сделать:

from itertools import groupby

a= [0,0,0,1,1,1,3,3,3]
b= ['a','b','c','d','e','f','g','h','i']

iter_b = iter(b)
output = [[next(iter_b) for _ in group] for key, group in groupby(a)]

print(output)
# [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]

groupby, чтобы получить последовательные группы идентичных значений a.Для каждой группы мы создаем список, содержащий столько следующих элементов b, сколько есть значений в группе.

0 голосов
/ 29 ноября 2018

Более простой метод без использования импорта с использованием словаря:

a= [0,0,0,1,1,1,3,3,3]
b= ['a','b','c','d','e','f','g','h','i']

d = {e: [] for e in set(a)} # Create a dictionary for each of a's unique key
[d[e].append(b[i]) for i, e in enumerate(a)] # put stuff into lists by index
lofl = list(d.values())

>>> lofl
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
0 голосов
/ 29 ноября 2018

Использование groupby :

from itertools import groupby
from operator import itemgetter

a = [0, 0, 0, 1, 1, 1, 3, 3, 3]
b = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

output = [list(map(itemgetter(1), group)) for _, group in groupby(zip(a, b), key=itemgetter(0))]
print(output)

Выход

[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...