Я пытаюсь иметь дело с вложенной структурой, которая выглядит так:
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)
Но, похоже, это вообще не работает. Может кто-нибудь помочь мне?
Большое спасибо заранее!
Теперь это намного понятнее, поэтому, если я правильно понял, использование zip или enumerate полностью эквивалентно. Верно?
Они оба создают объекты итераторов (выход на лету), хотя созданные объекты немного отличаются, один (zip) представляет собой кортеж для фактических совпадающих элементов, один представляет собой кортеж (индекс, элемент), оставляя вам возможность использовать индекс однако тебе нравится. Я предпочитаю enumerate в этом случае, так как код более явный.






Если ваши данные выглядят так:
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')]]
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')]
]
Вы можете использовать понимание списка.
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')]]
Обновление
Было бы более «безопасно» использовать длину col в качестве ограничения диапазона.
result = [[(*tup, col[i]) for tup in lst[i]] for i in range(len(col))]
Вам понадобится что-то вроде 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')]]
Использование 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')]]
ваша логика неверна... для кортежа каждый вы перебираете
column_to_add. Вы хотите сопоставить каждый индексinternal_listс соответствующим индексомcolumn_to_add. Ответ Zipa делает это с помощьюenumerate, который предоставляет индекс для работы. В ответе Ракеша используетсяzip, который застегивает два списка, где он их распаковывает и использует. Оба используют понимание списка, которое похоже на цикл for, добавляющий элементы к исходному пустому списку.