我正在编写一个python代码,如果年龄超过20,它将获取 RANK 的值。但是,请查看我的JSON文件:
[
{
"Age" : 22
"Rank": 100
}
{
"Age" : 64
"Rank": "20"
}
{
"Age" : 19
"Rank": 10
}
.
.
.
]
实际数据库比这个例子长;它达到十万。注意到一些数据搞砸了,因为一些 Rank 被写成String。
如何在没有问题的情况下获取所有 Rank 值?我是否需要在Rank值中制作另一个修剪引号(如果存在)的脚本?
编辑:我的Python代码
# assume 'file' is a file that I passed in argument during code execution
thefile = open(file)
thedata = json.load(thefile, encoding="latin1")
myContainer = []
for person in thedata:
if person["Age"] > 20:
myContainer.append(person["Rank"])
# Here is the issue why I can't let Rank be String
print sum(myContainer)/ len(myContainer)
UPDATE **
我的预期输出是[20,10]而不是[u'20,10]。
然后,当我对其进行平均时,它应该打印一个数字而不是错误。
答案 0 :(得分:1)
你可以在一行上做到这一点,但为了使这个简单易懂,这个工作正常。
newList = []
for item in yourList:
if int(item["age"]) > 20:
newlist.append(int(item["rank"]))
print newList
答案 1 :(得分:1)
这里有几个步骤,你可以根据需要合并它们。严格要求重新映射列表以预先拥有Rank
的int版本。
第一步是将Rank
的所有实例都设为int值,方法是将这些值中的字符串替换为等效的int。
然后过滤掉Age
不超过20的任何值。
现在您有一个简化的原始数据列表,因此将其映射为仅包含Rank
。
import json
from operator import itemgetter
data = '''[
{
"Age" : 22,
"Rank": 100
},
{
"Age" : 64,
"Rank": "20"
},
{
"Age" : 19,
"Rank": 10
}
]'''
def paramtoint(param):
def fn(d):
d[param] = int(d[param])
return d
return fn
fixed = map(paramtoint('Rank'), json.loads(data))
over20 = filter(lambda x: x['Age'] > 20 , fixed)
print(map(itemgetter('Rank'), over20))
输出
[100,20]
答案 2 :(得分:0)
ranklist = [int(_["rank"]) for _ in array if 20 < _["age"]]
其中array是从问题中显示的json文件解析的dicts的python列表。