我想将字典转换为字符串列表。虽然我的实际代码要长得多,但 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()
。
答案 0 :(得分:1)
您不能:只要您在定义 mydict
的行上点击“return”,Python 解释器就会计算所有表达式,而您已经丢失了原始形式。您无法分辨 0/255
与 0/3
或 1/2
与 3/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)}
通过这种方式,您无需完全转换。