Более Питонический Способ Сделать Это?

#python #list #dictionary #list-comprehension

Вопрос:

У меня есть список кортежей, и я хочу преобразовать его в список словарей, где для каждого кортежа ключи словаря являются индексом в кортеже, а значение-записью кортежа в этом индексе.

Например, если tuple_list=[('a','b','c'), ('e','f','g')] тогда цель состоит в том, чтобы иметь processed_tuple_list = [{0:'a',1:'b',2:'c'},{0:'e',1:'f',2:'g'}]

Мое текущее решение состоит в том, чтобы иметь функцию

 def tuple2dict(tup):  x = {}  for j in range(len(tup)):  x[j]=tup[j]  return x  

а потом позвони [tuple2dict(x) for x in tuple_list] . Я подозреваю, что для этого есть способ понимания списка, и я изначально пытался это сделать

 [{j:x[j]} for x in tuple_list for j in range(len(x))]  

но это только что дало мне список [{0:'a'},{1:'b'},...] . Любые советы по более питоническому способу сделать это были бы очень признательны.

Комментарии:

1. Перечислить-это то, что вы ищете.

Ответ №1:

Вы можете создать dict для каждого кортежа, list как показано ниже:

 gt;gt;gt; tuple_list=[('a','b','c'), ('e','f','g')] # Expanded solution for more explanation gt;gt;gt; [{idx: val for idx, val in enumerate(tpl)} for tpl in tuple_list] [{0: 'a', 1: 'b', 2: 'c'}, {0: 'e', 1: 'f', 2: 'g'}]  

Благодаря @ddejohn самый короткий подход:

 gt;gt;gt; [dict(enumerate(t)) for t in tuple_list]  

Комментарии:

1. [dict(enumerate(t)) for t in tuple_list] также работает

Ответ №2:

вы можете использовать zip [dict(zip(range(len(tp)),tp))) for tp in tuple_list]

Комментарии:

1. сверхинженерия

Ответ №3:

Сопоставьте перечисление в конструкторе словаря для каждого кортежа:

 processed_tuple_list = [*map(dict,map(enumerate,tuple_list))]  [{0: 'a', 1: 'b', 2: 'c'}, {0: 'e', 1: 'f', 2: 'g'}]  

Комментарии:

1. Спасибо! это именно то, что я искал.