将包含分数的字典转换为字符串

时间:2021-06-02 00:01:56

标签: python list dictionary

我想将字典转换为字符串列表。虽然我的实际代码要长得多,但 MWE 是:

>>> import json
>>> mydict = {'c1': (84/255, 0/255, 0/255), 'c2': (15/255, 123/255, 175/255)}
>>> json.dumps(mydict)

输出为:

'{"c1": [0.32941176470588235, 0.0, 0.0], "c2": [0.058823529411764705, 0.4823529411764706, 0.6862745098039216]}'

如果我尝试使用 fractions 包,似乎我可以将分数本身转换为合适的东西,但它不适用于字典或数组:

from fractions import Fraction

x = Fraction(84/255).limit_denominator()
print(x)

y = Fraction(np.array([84/255, 0/255])).limit_denominator()
print(y)

z = Fraction(mydict).limit_denominator()
print(z)

我想提取所有数值(同时将它们保留为分数)并将它们放在一个列表中,例如:

mylist = ['(84/255, 0/255, 0/255)', '(15/255, 123/255, 175/255)']

仅供参考,我无法在我的实际代码(不是这个 MWE)中将元组保存为字符串,因为我不允许更改特定格式。所以有必要直接转换mydict,例如。喜欢str(Fraction({'c1': (84/255, 0/255, 0/255), 'c2': (15/255, 123/255, 175/255)}).limit_denominator()

3 个答案:

答案 0 :(得分:1)

您不能:只要您在定义 mydict 的行上点击“return”,Python 解释器就会计算所有表达式,而您已经丢失了原始形式。您无法分辨 0/2550/31/23/6。如果你想保留分子和分母,那么我建议你使用Fraction包。

答案 1 :(得分:0)

如果是这样,为什么不将这些表达式存储为字符串,并在需要时使用 eval

mydict = {'c1': '(84/255, 0/255, 0/255)', 'c2': '(15/255, 123/255, 175/255)'}

evaluated = {key: eval(val) for key,val in mydict.items()}

答案 2 :(得分:0)

如果您知道所有分数的分母都是 255。您可以构建一个辅助方法,该方法将遍历您的字典,构建自己的字符串以进行显示。

这是一个例子:

def dump_by_fraction(dictionary: dict):
    output_string = ''
    first_item = True
    for key, faction_list in dictionary.items():
        item_output = ''
        for index, fraction in enumerate(faction_list):
            item_output += (", " if index > 0 else "") + f"{math.floor(fraction * 255)} / 255"
        output_string += ("" if first_item > 0 else ", ") + f"'{key}': [{item_output}]"
        first_item = False
    print('{' + output_string + '}')

您可以尝试调用 dump_by_fraction(mydict) 而不是 json.dumps(mydict)

我只会将它用于调试/显示目的,因为在整数和浮点数之间来回转换时可能会丢失数据。

一个更简单的解决方案可能是将 RGB 值存储为整数并完全删除 / 255,因为您会知道它在 255 之外。

例如:

mydict = {'c1': (84, 0, 0), 'c2': (15, 123, 175)}

通过这种方式,您无需完全转换。