使用Python

时间:2017-03-01 00:45:59

标签: python

我正在编写一个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]。

然后,当我对其进行平均时,它应该打印一个数字而不是错误。

3 个答案:

答案 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列表。