以ruby哈希格式打印python字典

时间:2017-04-02 08:06:02

标签: python ruby dictionary hash

我有一个简单的python dict,它以下面的格式打印,

{'stats1': {'var': {'avail': 'yes'}, 'target': {'avail': 'no'}}}

但我正在寻找以下面的格式打印它,如ruby hash,

{'stats1'=> {'var'=> {'avail'=> 'yes'}, 'target'=> {'avail'=> 'no'}}}

我尝试了谷歌以红宝石哈希格式打印python dict的方法,但没有运气。

2 个答案:

答案 0 :(得分:4)

可以通过对字典的递归扫描来完成,检查值是否是字典的实例以进行递归调用,否则只需打印(也可以处理引用字符串的转义)

def rp(d,outstream):
    outstream.write("{")
    first_print = True
    for k,v in d.items():
        if not first_print:
            outstream.write(",")
        else:
            first_print = False
        outstream.write("'{}'=> ".format(k.replace("'",r"\'")))
        if isinstance(v,dict):
            rp(v,outstream)
        else:
            outstream.write("'{}'".format(v.replace("'",r"\'")))

    outstream.write("}")

可以使用sys.stdoutio进行测试以获取str对象

import io

d = {'stats1': {'var': {'avail': 'yes'}, 'target': {'avail': 'no'}}}

outs = io.StringIO()
rp(d,outs)
print(outs.getvalue())

结果:

{'stats1'=> {'target'=> {'avail'=> 'no'},'var'=> {'avail'=> 'yes'}}}

当然这个解决方案很脆弱:例如,传递一个dicts列表是行不通的。当然,可以使用更多编码和isinstance来完成。而且可能还有更多的角落。

答案 1 :(得分:2)

我找到了一个简单的解决方法。如果ddict

print(str(d).replace(': ', '=> '))

这是有效的,因为字典中的字符串中没有: