Объединение 2 списков списков в Python - PullRequest
0 голосов
/ 24 апреля 2018

Я новичок в питоне. Мне нужно объединить 2 списка списков на основе первого элемента в каждом списке. Вот списки:

first_list = [['aaa', 551, 10972],
              ['bbb', 552, 10872],
              ['ccc', 553, 11103],
              ['ddd', 554, 10912]]

second_list = [['aaa', 240], 
               ['bbb', 120], 
               ['ccc', 325], 
               ['ddd', 270]]

Код, который я написал:

join_list = []
for x in range(0, len(first_list)):
    temp = [first_list[x], second_list[x][1]]
    join_list.append(temp)

Следующий вывод:

join_list =
[[['aaa', 551, 10972], 240],
 [['bbb', 552, 10872], 120],
 [['ccc', 553, 11103], 325],
 [['ddd', 554, 10912], 270]]

Мне нужно сгладить список в каждом элементе в join_list, например, первый элемент в join_list[0] = ['histogram', 551, 10972, 240]. Кроме того, если порядок второго списка изменяется, и если в первом элементе есть добавление подсписка, эти 2 списка все еще могут быть объединены на основе первого индекса в каждом элементе. Итак, это работает как VLOOKUP или HLOOKUP в Ms.Excel. Как мы можем это сделать?

Ответы [ 4 ]

0 голосов
/ 24 апреля 2018

Может быть, это то, что вы ищете:

d = dict(second_list)
flat = [a+[d[a[0]]] for a in first_list]

Это дает мне:

flat = [['aaa', 551, 10972, 240],
 ['bbb', 552, 10872, 120],
 ['ccc', 553, 11103, 325],
 ['ddd', 554, 10912, 270]]

Таким образом, порядок вашего второго списка не имеет значения.

0 голосов
/ 24 апреля 2018

Это один из способов, который не предполагает определенного упорядочения любого из списков.

d = dict(second_list)

res = [i + [d[i[0]]] for i in first_list]

[['aaa', 551, 10972, 240],
 ['bbb', 552, 10872, 120],
 ['ccc', 553, 11103, 325],
 ['ddd', 554, 10912, 270]]
0 голосов
/ 24 апреля 2018

Вы можете ввести lookup dict и установить значение по умолчанию в случае отсутствия совпадения:

lookup = dict(second_list)
default = 0
join_list = [i + [lookup.get(i[0], default)] for i in first_list]

Здесь по умолчанию установлено значение 0.

0 голосов
/ 24 апреля 2018

Использование chain из itertools для выравнивания

Демонстрация:

first_list = [['aaa', 551, 10972],
              ['bbb', 552, 10872],
              ['ccc', 553, 11103],
              ['ddd', 554, 10912]]

second_list = [['aaa', 240], 
               ['bbb', 120], 
               ['ccc', 325], 
               ['ddd', 270]]

from itertools import chain
print([list(chain(*[v, [second_list[i][1]]])) for i, v in enumerate(first_list)])

Выход:

[['aaa', 551, 10972, 240], ['bbb', 552, 10872, 120], ['ccc', 553, 11103, 325], ['ddd', 554, 10912, 270]]
...