Вложенная структура: список списков кортежей python - PullRequest
4 голосов
/ 17 мая 2019

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

list_of_lists= [[("aaa"),("bbb")],[("ccc"),("ddd")],[("eee"),("fff")]]

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

 column_to_add = ["string1", "string2", "string3"]

Окончательный результат должен выглядеть следующим образом:

[[("aaa", "string1"),("bbb", "string1")],[("ccc", "string2"),("ddd", "string2")],[("eee", "string3"),("fff", "string3")]]

Я пробовал что-то вроде этого:

result= []
for internal_list in list_of_lists:
    for tuple in internal_list:
        for z in tuple:
            for new_string in column_to_add:
                kk=list(tuple)
                result = tuple.append(new_string)

Но, похоже, это не работает вообще. Кто-нибудь может мне помочь?

Большое спасибо заранее!

Ответы [ 5 ]

5 голосов
/ 17 мая 2019

Если ваши данные выглядят так:

list_of_lists= [[("aaa", ),("bbb", )],[("ccc", ),("ddd", )],[("eee", ),("fff", )]]

Вы должны использовать:

[[y + (column_to_add[i], ) for y in x] for i, x in enumerate(list_of_lists)]

Это дает:

#[[('aaa', 'string1'), ('bbb', 'string1')],
# [('ccc', 'string2'), ('ddd', 'string2')],
# [('eee', 'string3'), ('fff', 'string3')]]
3 голосов
/ 17 мая 2019

Использование zip и понимание вложенного списка

Пример:

list_of_lists= [[("aaa"),("bbb")],[("ccc"),("ddd")],[("eee"),("fff")]]
column_to_add = ["string1", "string2", "string3"]

print([[(i, n) for i in m] for m,n in zip(list_of_lists, column_to_add)])

Вывод:

[[('aaa', 'string1'), ('bbb', 'string1')],
 [('ccc', 'string2'), ('ddd', 'string2')],
 [('eee', 'string3'), ('fff', 'string3')]]
2 голосов
/ 17 мая 2019

Вам понадобится что-то вроде zip().

Сначала сохраните (aaa, bbb) и string1 в паре.

a = [[("aaa"),("bbb")],[("ccc"),("ddd")],[("eee"),("fff")]]
b = ["string1", "string2", "string3"]
zipped_data = list(zip(a, b))

# zipped_data = [(['aaa', 'bbb'], 'string1'), (['ccc', 'ddd'], 'string2'), (['eee', 'fff'], 'string3')]

Затем позвольте string1 составить пару с каждымитератор кортежа (aaa, bbb).

new_list = []
for u in zipped_data:
    new_list.append([(u[0][0], u[1]), (u[0][1], u[1])])
print(new_list)

Выходные данные

[[('aaa', 'string1'), ('bbb', 'string1')], [('ccc', 'string2'), ('ddd', 'string2')], [('eee', 'string3'), ('fff', 'string3')]]
2 голосов
/ 17 мая 2019
list_of_lists= [[("aaa"),("bbb")],[("ccc"),("ddd")],[("eee"),("fff")]]
column_to_add = ["string1", "string2", "string3"]
res  = list(map(lambda x,y: [(i,y) for i in x], list_of_lists, column_to_add))
print(res)

выход

[
   [('aaa', 'string1'), ('bbb', 'string1')], 
   [('ccc', 'string2'), ('ddd', 'string2')], 
   [('eee', 'string3'), ('fff', 'string3')]
]
1 голос
/ 17 мая 2019

Вы можете использовать списочные выражения.

lst = [[("aaa",), ("bbb",)], [("ccc",), ("ddd",)], [("eee",), ("fff",)]]
col = ["string1", "string2", "string3"]

result = [[(*tup, col[i]) for tup in lst[i]] for i in range(len(lst))]

Выход:

[[('aaa', 'string1'), ('bbb', 'string1')], [('ccc', 'string2'), ('ddd', 'string2')], [('eee', 'string3'), ('fff', 'string3')]]

Upd.

Может быть более «безопасно» использовать длину col в качестве ограничения диапазона.

result = [[(*tup, col[i]) for tup in lst[i]] for i in range(len(col))]
...