Как объединить списки в списки в Python на основе общего элемента - PullRequest
1 голос
/ 02 апреля 2020

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

List1 = [['Jack','27','cat','house','fireman'], ['Tom','43','cat','Flat','Doctor'], ['Ben','30','Dog','house','Postman']]

List2 = [['Orange','5','Tom'], ['Blue','11','Ben'], ['Red','21','Jack']]

Я хочу объединить списки вместе, где имя совпадает:

Result_list = [['Jack','27','cat','house','fireman','Red','21','Jack'], ['Tom','43','cat','Flat','Doctor','Orange','5','Tom'], ['Ben','30','Dog','house','Postman','Blue','11','Ben']]

Имена всегда будут в позиции [0] в списках в list1 и [2] в списках в list2

Я довольно новичок в python и не могу понять, как это сделать. Кто-нибудь может предложить решение?

Спасибо

Ответы [ 4 ]

1 голос
/ 02 апреля 2020

Вы можете сделать это, используя словарь, как в индексе для List2, и создать объединенный список с пониманием в List1, который объединяет соответствующий подсписок в словаре:

List1 = [['Jack','27','cat','house','fireman'], ['Tom','43','cat','Flat','Doctor'], ['Ben','30','Dog','house','Postman']]
List2 = [['Orange','5','Tom'], ['Blue','11','Ben'], ['Red','21','Jack']]

match  = { sl[2]:sl for sl in List2 }
merged = [ sl+match[sl[0]] for sl in List1 ]

output:

print(merged)

[['Jack', '27', 'cat', 'house', 'fireman', 'Red', '21', 'Jack'],
 ['Tom', '43', 'cat', 'Flat', 'Doctor', 'Orange', '5', 'Tom'],
 ['Ben', '30', 'Dog', 'house', 'Postman', 'Blue', '11', 'Ben']]
1 голос
/ 02 апреля 2020
list1 = [['Jack','27','cat','house','fireman'], 
['Tom','43','cat','Flat','Doctor'], 
['Ben','30','Dog','house','Postman']]

list2 = [['Orange','5','Tom'], ['Blue','11','Ben'], ['Red','21','Jack']]

for i in list1:
    for j in list2:
        if i[0] == j[2]:
            i.extend(j)
print(list1)

вывод:

[['Jack', '27', 'cat', 'house', 'fireman', 'Red', '21', 'Jack'],
 ['Tom', '43', 'cat', 'Flat', 'Doctor', 'Orange', '5', 'Tom'],
 ['Ben', '30', 'Dog', 'house', 'Postman', 'Blue', '11', 'Ben']]
1 голос
/ 02 апреля 2020

Это один подход путем преобразования одного из списка в dict.

List1 = [['Jack','27','cat','house','fireman'], ['Tom','43','cat','Flat','Doctor'], ['Ben','30','Dog','house','Postman']]
List2 = [['Orange','5','Tom'], ['Blue','11','Ben'], ['Red','21','Jack']]

List2_d = {i[-1]: i for i in List2}
for j in List1:
    if j[0] in List2_d:
        j.extend(List2_d[j[0]])

print(List1) 

Вывод:

[['Jack', '27', 'cat', 'house', 'fireman', 'Red', '21', 'Jack'],
 ['Tom', '43', 'cat', 'Flat', 'Doctor', 'Orange', '5', 'Tom'],
 ['Ben', '30', 'Dog', 'house', 'Postman', 'Blue', '11', 'Ben']]
0 голосов
/ 02 апреля 2020

Вы можете использовать defaultdict для группировки по именам:

from collections import defaultdict

List1 = [['Jack','27','cat','house','fireman'], ['Tom','43','cat','Flat','Doctor'], ['Ben','30','Dog','house','Postman']]

List2 = [['Orange','5','Tom'], ['Blue','11','Ben'], ['Red','21','Jack']]

d = defaultdict(list)
for lst in List1:
    d[lst[0]].extend(lst)

for lst in List2:
    d[lst[-1]].extend(lst)

print([v for v in d.values()])

Поскольку оба списка имеют одинаковую длину, мы также можем обойтись без zip здесь:

d = defaultdict(list)

for x, y in zip(List1, List2):
    d[x[0]].extend(x)
    d[y[-1]].extend(y)

print([v for v in d.values()])

Выход:

[['Jack', '27', 'cat', 'house', 'fireman', 'Red', '21', 'Jack'], ['Tom', '43', 'cat', 'Flat', 'Doctor', 'Orange', '5', 'Tom'], ['Ben', '30', 'Dog', 'house', 'Postman', 'Blue', '11', 'Ben']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...