присваивать значение элементу в списке списков python - PullRequest
0 голосов
/ 12 марта 2020

У меня есть следующий список списков:

lis1 = [['name', 'lastname'], ['name', 'lastname']]

и следующий список:

list2 = ['tom', 'miller', 'john', 'snow']

Я хочу получить этот результат:

final_result = [[{'name': 'tom', 'lastname': 'miller'}], [{'name': 'john', 'lastname': 'snow'}]]

Я не уверен, как это сделать, сохранив оригинал length из list1.

Есть мысли?

Ответы [ 5 ]

2 голосов
/ 12 марта 2020

Аналогично подходу @ Rake sh, но с более кратким кодом, использующим zip и вместо него конструктор dict:

i = iter(list2)
final_result = [[dict(zip(l, i))] for l in lis1]

final_result становится:

[[{'name': 'tom', 'lastname': 'miller'}], [{'name': 'john', 'lastname': 'snow'}]]
2 голосов
/ 12 марта 2020

Это один подход, использующий iter.

Пример:

lis1 = [['name', 'lastname'], ['name', 'lastname']]
list2 = iter(['tom', 'miller', 'john', 'snow'])

for i, v in enumerate(lis1):
    lis1[i] = {j:next(list2) for j in v}

print(lis1)

или использование списка

Пример:

final_result = [{j:next(list2) for j in v} for v in lis1]

Выход:

[{'lastname': 'miller', 'name': 'tom'}, {'lastname': 'snow', 'name': 'john'}]
1 голос
/ 12 марта 2020

Используя grouper из рецептов itertools , вы можете сделать:

from itertools import zip_longest


def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)


list1 = [['name', 'lastname'], ['name', 'lastname']]
list2 = ['tom', 'miller', 'john', 'snow']

res = []
for k, v in zip(list1, grouper(list2, 2)):
    res.append(dict(zip(k, v)))

, что дает:

print(res)  # -> [{'name': 'tom', 'lastname': 'miller'}, {'name': 'john', 'lastname': 'snow'}]
1 голос
/ 12 марта 2020

Обратите внимание, что ваши элементы list1 повторяются, поэтому мы можем определить keys=list1[0].

Используя эту запись и запись среза списка, мы можем написать:

final_result = [dict(zip(keys,l)) for l in list(zip(list2[0::2], list2[1::2]))]

, что приводит к:

[{'lastname': 'miller', 'name': 'tom'}, {'lastname': 'snow', 'name': 'john'}]
1 голос
/ 12 марта 2020

Чтобы получить список версий, вы можете сделать:

lis1 = [['name', 'lastname'], ['name', 'lastname']]

list2 = ['tom', 'miller', 'john', 'snow']

list_iter = iter(list2)

final_result = [
                 [f"{elem1}: {next(list_iter)}" for elem1 in inner_list] 
                 for inner_list in lis1
               ]

print(final_result)

Вывод:

[['name: tom', 'lastname: miller'], ['name: john', 'lastname: snow']]

Для dict внутри list:

>>> list_iter = iter(list2)

>>> final_result = [
                     [{elem1: next(list_iter) for elem1 in inner_list}] 
                     for inner_list in lis1
                   ]

Вывод:

[[{'name': 'tom', 'lastname': 'miller'}],
 [{'name': 'john', 'lastname': 'snow'}]]

И очень уродливый способ выглядит так:

>>> [[dict(elem)] for elem in zip(*[zip(sum(lis1, []),list2)]*2)]

[[{'name': 'tom', 'lastname': 'miller'}],
 [{'name': 'john', 'lastname': 'snow'}]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...