Как объединить два массива в список, у которого есть внутренний список? - PullRequest
0 голосов
/ 10 марта 2019

У меня было два списка:

a=[0,0,0,1,1,1,1,2,2]
b=[2,5,12,2,3,8,9,4,6]

И я хотел получить:

c=[[0,2,5,12],[1,2,3,8,9],[2,4,6]]

А и В коррелировали друг с другом, a[i] относились к b[i], когдазначение в a изменяется как 0 на 1, 12 заканчивается в первом внутреннем списке c.

Я пробовал это с оператором if else, но это не удалось

Как получить C в Python?

Ответы [ 4 ]

1 голос
/ 10 марта 2019

Этот код достаточно хорошо выдает c (при условии, что a и b всегда настраиваются так же, как в примере):

a=[0,0,0,1,1,1,1,2,2]
b=[2,5,12,2,3,8,9,4,6]

c = []

i = 0

while i < len(a):
  d = a.count(a[i])
  c.append([a[i]] + b[i:i + d])
  i += d

print(c) # ==> [[0, 2, 5, 12], [1, 2, 3, 8, 9], [2, 4, 6]]
0 голосов
/ 10 марта 2019

Вот мое простое решение.Обратите внимание, что вы разделяете список по количеству элементов в списке a.deque используется для выталкивания элементов в O (1) раз слева.

import itertools 
from collections import Counter, deque

a = [0,0,0,1,1,1,1,2,2]
b = deque([2,5,12,2,3,8,9,4,6])
c = Counter(a)

new_list=[] 
for x in c:
    new_list.append([x]+[b.popleft() for i in range(a[x])])
0 голосов
/ 10 марта 2019

Аналогично ответу @Thierry Lathuille, но на самом деле он добавляет ключи к подспискам в соответствии с запросом OP:

import itertools as it

ib = iter(b)
[[k, *(next(ib) for _ in gr)] for k, gr in it.groupby(a)]
# [[0, 2, 5, 12], [1, 2, 3, 8, 9], [2, 4, 6]]
0 голосов
/ 10 марта 2019

Мы можем zip списки, сгруппировать по первому значению от a и составить списки со вторым:

from itertools import groupby
from operator import itemgetter

a=[0,0,0,1,1,1,1,2,2]
b=[2,5,12,2,3,8,9,4,6]

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

#[[2, 5, 12], [2, 3, 8, 9], [4, 6]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...