Словарь в списке
Я хочу напечатать словарь внутри списка следующим образом:
[{name : 'red', id : '1'}, {name : 'yellow', id : '2'}, {name : 'black', id : '3'}, {name : 'white', id : '4'}]'
Мне не нужны котировки по name
и id
. Тем не менее, я хочу, чтобы они были в части значений этого словаря.
Ответы
Ответ 1
Для этого вам нужно написать свою собственную функцию форматирования.
Здесь волосатая, но красная функция, которая делает то, что вы хотите:
def pretty_print(data):
return '[%s]' % ', '.join(
'{%s}' % ', '.join(
'%s : %r' % (key, value) for key, value in item.items()
) for item in data
)
Итак, следующий код:
print(pretty_print([
{'name': 'red', 'id': '1'},
{'name': 'yellow', 'id': '2'},
]))
Будет печать:
[{name : 'red', id : '1'}, {name : 'yellow', id : '2'}]
Ответ 2
Вы можете преобразовать это так:
Код:
def fix_key_formatting(data_to_dump, keys_to_fix):
return_str = json.dumps(data_to_dump)
for key in keys_to_fix:
return_str = return_str.replace('"%s":' % key, '%s:' % key)
return return_str
Тестовый код:
data = [
{'name': 'red', 'id': '1'},
{'name': 'yellow', 'id': '2'},
{'name': 'black', 'id': '3'},
{'name': 'white', 'id': '4'}
]
import json
print(fix_key_formatting(data, ('id', 'name')))
Результаты:
[
{name: "red", id: "1"},
{name: "yellow", id: "2"},
{name: "black", id: "3"},
{name: "white", id: "4"}
]
Ответ 3
Вы можете создать простой класс с помощью метода __repr__
для хранения строкового значения:
class String:
def __init__(self, val):
self.val = val
def __repr__(self):
return self.val
data = [{'name' : 'red', 'id' : '1'}, {'name' : 'yellow', 'id' : '2'}, {'name' : 'black', 'id' : '3'}, {'name' : 'white', 'id' : '4'}]
final_data = [{String(c):d for c, d in i.items()} for i in data]
Выход:
[{name: 'red', id: '1'}, {name: 'yellow', id: '2'}, {name: 'black', id: '3'}, {name: 'white', id: '4'}]
Чтобы получить доступ к строковым значениям, вы можете вызвать атрибут:
string_values = [{c.val:d for c, d in i.items()} for i in final_data]
Чтобы применить класс String
ко всем ключам в произвольной структуре, можно использовать рекурсию:
def convert_string(d):
return {String(a):convert_string(b) if isinstance(b, dict) else b for a, b in d.items()}
data = [{'name' : {'first':'blue', 'last':'black', 'known_ids':[34, 5, 12, 34]}, 'id' : '1'}, {'name' : 'yellow', 'id' : '2'}, {'name' : 'black', 'id' : '3'}, {'name' : 'white', 'id' : '4'}]
new_data = list(map(convert_string, data))
Выход:
[{name: {first: 'blue', last: 'black', known_ids: [34, 5, 12, 34]}, id: '1'}, {name: 'yellow', id: '2'}, {name: 'black', id: '3'}, {name: 'white', id: '4'}]
Ответ 4
Вот еще одно не очень элегантное, но функциональное решение:
inList = [{'name' : 'red', 'id' : '1'}, {'name' : 'yellow', 'id' : '2'}, {'name' : 'black', 'id' : '3'}, {'name' : 'white', 'id' : '4'}]
def getDictFormatted(inDict):
return "{" + ", ".join(k + " : " + repr(v) for k,v in inDict.items()) + "}"
def printListFormatted(inList):
output = "[" + ", ".join(getDictFormatted(d) for d in inList) + "]"
print(output)
printListFormatted(inList)
Выход:
[{id : '1', name : 'red'}, {id : '2', name : 'yellow'}, {id : '3', name : 'black'}, {id : '4', name : 'white'}]