Python как преобразовать этот тип списка в dictionary

#python

#python

Вопрос:

 [["4040", ["4040", "1.04862754", 4]], ["4040.1", ["4040.1", "0.25906621", 1]], ["4040.2", ["4040.2", "0.954", 1]]]
  

чего я хочу, так это:

 {"4040": ["4040", "1.04862754", 4]}, {"4040.1": ["4040.1", "0.25906621", 1]}, {"4040.2": ["4040.2", "0.954", 1]}
  

я хочу отправить эти данные в redis в формате json, но возникли трудности с преобразованием. На самом деле я уже записываю эти данные в dictionary, но перед отправкой в redis мне нужно отсортировать ключи, чтобы python преобразовал их в список

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

1. да, он выдает: Invalid input of type: 'list'. Convert to a byte, string or number first.

2. Здесь есть двусмысленность. {"4040": ["4040", "1.04862754", 4]}, {"4040.1": ["4040.1", "0.25906621", 1]}, {"4040.2": ["4040.2", "0.954", 1]} это не словарь. Это набор словарей. Пожалуйста, уточните: вам нужен набор словарей или вам нужен один словарь? Если это последнее, на что это похоже?

3. «я хочу отправить эти данные в redis в формате json (…), но перед отправкой в redis мне нужно отсортировать ключи» => вы знаете, что объекты json представляют собой неупорядоченные коллекции key: values, не так ли? (и, FWIW, python dicts тоже неупорядочены, по крайней мере, до версии 3.7.x)

4. Кстати, что вы пробовали, что не сработало?

Ответ №1:

Используя нарезку:

 print({x[0]: x[1:] for x in lst})
  

ВЫВОД:

 {'4040': [['4040', '1.04862754', 4]], '4040.1': [['4040.1', '0.25906621', 1]], '4040.2': [['4040.2', '0.954', 1]]}
  

или

 print(dict(lst))
  

ВЫВОД:

 {'4040': ['4040', '1.04862754', 4], '4040.1': ['4040.1', '0.25906621', 1], '4040.2': ['4040.2', '0.954', 1]}
  

или

Если вы хотите, чтобы список dicts был разделен:

 print([{x[0]: x[1]} for x in lst]) 
  

ВЫВОД:

 [
   {'4040': ['4040', '1.04862754', 4]}, {'4040.1': ['4040.1', '0.25906621', 1]}, {'4040.2': ['4040.2', '0.954', 1]}
]
  

или

(Часто все просто, но мы усложняем их сами)

 print([{k:v} for k, v in lst])
  

ВЫВОД:

 [
  {'4040': ['4040', '1.04862754', 4]}, {'4040.1': ['4040.1', '0.25906621', 1]}, {'4040.2': ['4040.2', '0.954', 1]}
]
  

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

1. Однако здесь каждое значение заключено в дополнительный список. Не уверен, что такое поведение было желательным?

2. @TomMP добавил альтернативу 😉

3. Приятно, но это все еще не совсем то, о чем просил OP, насколько я могу судить. Они хотели, чтобы каждая запись в вашем словаре была словарем, а не содержала все это в одном. По их форматированию было трудно определить, я допустил ту же ошибку в первой версии моего ответа. Тем не менее, это довольно приятно, я понятия не имел, что python просто «выяснит», как преобразовать подобный список в dict.

4. @TomMP добавил еще одну альтернативу! 😉

5. @DirtyBit точно

Ответ №2:

Если вы хотите преобразовать этот список в список словарей, понимания списка будет достаточно:

 >>> list_of_kv = [["4040", ["a", "b", 4]], ["4040.1", ["d", "e", 1]]]

>>> [{k: v} for k, v in list_of_kv]
[{'4040': ['a', 'b', 4]}, {'4040.1': ['d', 'e', 1]}]
  

Если вместо этого вам нужен один словарь, встроенный dict класс может его обработать:

 >>> dict(list_of_kv)
{'4040': ['a', 'b', 4], '4040.1': ['d', 'e', 1]}
  

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

1. поздравляем, это первый ответ, в котором делается простая очевидная вещь!

2. Вот дополнительный голос «за» и с моей стороны 1

3. «Для меня было честью, сэр».

Ответ №3:

Редактировать: Просто увидел, что вам нужны три словаря, соответствующим образом изменил код.

 my_list = [["4040", ["4040", "1.04862754", 4]], ["4040.1", ["4040.1", "0.25906621", 1]], ["4040.2", ["4040.2", "0.954", 1]]]

result = []

for elem in my_list:
    my_dict = {elem[0]: elem[1]}
    result.append(my_dict)

print(result)
  

Вывод:

 [
  {'4040': ['4040', '1.04862754', 4]},
  {'4040.1': ['4040.1', '0.25906621', 1]},
  {'4040.2': ['4040.2', '0.954', 1]}
]
  

Или, как указано в комментариях, используйте понимание списка и сэкономьте себе достаточное количество строк:

 result = [{k:v} for k, v in my_list]
  

Это должно делать то, что вы хотите.

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

1. или проще: result = [{k:v} for k, v in my_list]

Ответ №4:

Попробуйте:

 >>> L = [["4040", ["4040", "1.04862754", 4]], ["4040.1", ["4040.1", "0.25906621", 1]], ["4040.2", ["4040.2", "0.954", 1]]]
>>> dict(map(tuple, L))
{'4040': ['4040', '1.04862754', 4], '4040.1': ['4040.1', '0.25906621', 1], '4040.2': ['4040.2', '0.954', 1]}
  

map(tuple, L) преобразует L[0] , L[1] , … в кортежи. dict преобразует k, v кортежи в словарные записи.