#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
кортежи в словарные записи.