我试图制作一个区域类来总结关键区域的所有实例'在json字符串中。
例如e = Area('[1, 2, 3, {"area": 123, "weight": 1000}]')
应返回e=123
,此Area('["Hello", "World", {"area": 999}, {"area": 1}]')
应返回1000。
目前我每次都会返回0,我认为这可能是因为我过早地初始化sum
或因为我对字符串的索引可能已关闭。
import json
class Area:
def __init__(self, txt):
self.txt=txt
def __str__(self):
sum=0
for a in self.txt:
if a == 'area':
sum+=int(self.txt[a]})
return str(sum)
答案 0 :(得分:1)
使用json.loads
很好但你需要确保你有一个可以用isinstance做的字典,你可以使用内置的sum函数为你做总结。
import json
class Area:
def __init__(self, txt):
self.txt = txt
def __str__(self):
return str(sum(d.get("area", 0) for d in json.loads(self.txt)
if isinstance(d, dict)))
输出:
In [8]: e = Area('[1, 2, 3, {"area": 123, "weight": 1000}]')
In [9]: print e
123
In [10]: e = Area('["Hello", "World", {"area": 999}, {"area": 1}]')
In [11]: print e
1000
在您自己的代码中,您正在迭代字符串中的字符,因为您从未调用loads
,因此当您比较" area"时,if a == 'area':
将永远不会为True。对于每个单独的char,因为self.txt[a]}
是无效的语法,因此您的代码也会出错。
答案 1 :(得分:0)
这很有效。
然后你应该测试列表中的每个元素以查看它是否包含项area
,你应该记住,列表中的所有项都不会支持in
运算符,所以包装它在异常块中。
最后,你在__str__
方法中做这一切似乎很奇怪。拥有一个返回
import json
class Area:
def __init__(self, txt):
self.txt = json.loads(txt)
def __str__(self):
sum = 0
for a in self.txt:
try:
if 'area' in a:
sum += int(a['area'])
except TypeError:
pass
return str(sum)
print Area('[1, 2, 3, {"area": 123, "weight": 1000}]')
print Area('["Hello", "World", {"area": 999}, {"area": 1}]')