列表中的字典

13
我想在列表中打印一个类似这样的字典:
[{name : 'red', id : '1'}, {name : 'yellow', id : '2'}, {name : 'black', id : '3'}, {name : 'white', id : '4'}]`

我不想在nameid中使用引号。但是,我希望在该字典的值部分中使用引号。


我对最佳解决方案感兴趣,可能需要使用自定义编码器类或不需要进行任何 hacky 操作。 - jamylak
5
问题是为什么 - 如果你想将它转换成Javascript,那可能不够。 - Antti Haapala -- Слава Україні
4个回答

17

你需要编写自己的格式化函数来实现此功能。

这是一个复杂但简洁的函数,可以实现你想要的功能:

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'}]

4
你可以这样转换:

代码:

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"}
]

对不起,列表也要求像这样: - Anmol Gautam

4
你可以创建一个简单的类,并使用__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'}]

我喜欢这个方向的总体思路,如果它可以集成到json自定义编码器类中,那么它就会更完整。我知道你可以更改自定义类型的表示方式。然后,如果我们想采用规范方法,我们可以让它递归遍历所有字典并将它们替换为String类。但是,我对当前的方法感到满意,因为它已经足够扩展了。 - jamylak
集成 json 模块的问题在于键必须是字符串,也许有一些解决方法。 - jamylak

2
这里有另一种不太优雅但功能性的解决方案:
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'}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接