根据字典

时间:2016-10-03 16:15:50

标签: python json python-2.7 dictionary

我从.json加载并存储在变量Data中的以下信息:

Data = [
    {u'rating': u'89', u'rare': u'1', u'name': u'Pogba', u'club_image': u'/content/fifa17/img/clubs/11.png', u'image': u'/content/fifa17/img/players/195864.png', u'rare_type': u'3', u'version': u'IF', u'full_name': u'Pogba', u'position': u'CDM', u'id': u'15073', u'nation_image': u'/content/fifa17/img/nation/18.png'},
    {u'rating': u'89', u'rare': u'1', u'name': u'Pogba', u'club_image': u'/content/fifa17/img/clubs/11.png', u'image': u'/content/fifa17/img/players/195864.png', u'rare_type': u'21', u'version': u'OTW', u'full_name': u'Pogba', u'position': u'CM', u'id': u'15091', u'nation_image': u'/content/fifa17/img/nation/18.png'},
    {u'rating': u'88', u'rare': u'1', u'name': u'Pogba', u'club_image': u'/content/fifa17/img/clubs/11.png', u'image': u'/content/fifa17/img/players/195864.png', u'rare_type': u'1', u'version': u'Normal', u'full_name': u'Pogba', u'position': u'CM', u'id': u'78', u'nation_image': u'/content/fifa17/img/nation/18.png'}
]

我希望根据用户输入的播放器的rating提取信息,仅当存在其他评级时 EDIT 通过这个,我的意思是如果只有一行,即1个等级,就没有必要执行这个过程。

例如,如果用户输入了:88,则会返回/打印:

{u'rating': u'88', u'rare': u'1', u'name': u'Pogba', u'club_image': u'/content/fifa17/img/clubs/11.png', u'image': u'/content/fifa17/img/players/195864.png', u'rare_type': u'1', u'version': u'Normal', u'full_name': u'Pogba', u'position': u'CM', u'id': u'78', u'nation_image': u'/content/fifa17/img/nation/18.png'}

从我最小的知识,我知道我必须使用词典,但我不知道如何这样做。但是,我目前处于尝试的下一阶段:

player_dict = {Data}
player_info = player_dict.get(user_input)
if player_info:
    for item in player_info:
        player_info = item

^ 这根本不起作用。

4 个答案:

答案 0 :(得分:0)

在这种情况下,你需要循环你的值并将输入的值与你已经输入的值进行比较,对吗?

所以player_dict是一个字典列表,每个字典都包含有关播放器的属性,其中rating是一个。 另外,假设player_info是用户输入的评分,例如88

for player_dict in player_dict:
    try:
         if player_dict['rating']==player_info:
              return player_dict
    except KeyError:
         print 'there is no key called rating in this dict!'

答案 1 :(得分:0)

您可以使用列表推导:

[record for record in Data if record.get("rating") == ratingWeWant]

其中ratingWeWant是您要搜索的评分。

该代码将根据指定评级的数据生成记录列表,例如:

[{u'rating': u'88', u'club_image': u'/content/fifa17/img/clubs/11.png', u'image': u'/content/fifa17/img/players/195864.png', u'full_name': u'Pogba', u'id': u'78', u'nation_image': u'/content/fifa17/img/nation/18.png', u'rare': u'1', u'name': u'Pogba', u'rare_type': u'1', u'version': u'Normal', u'position': u'CM'}]

您帖子中的数据。

另外,因为我们使用了.get() dict方法,所以我们不必担心异常。

答案 2 :(得分:0)

您要做的事情称为"查找"。给定一个密钥(u' 88'或其他评级),您需要一个值(字典,其中'评级'是' 88')。列表对象,就像您目前存储的字典一样,对于此类查找不是很好,因为您必须遍历列表中的每个索引,将评级与密钥进行比较,然后返回字典(如果它存在于全部)。

key = u'88'
for d in Data:
    if d['rating'] == key:
        print d

考虑当您在该列表中存储大量字典时会发生什么。如果没有一个词典的评级等于密钥怎么办?你通过大量的词典,检查平等,只有不存在。这是浪费的计算。

如您所知,python的dict类型非常适合查找。如果你有一个看起来像

的字典
Data_dict = {u'88': {u'rare': u'1', u'name': u'Pogba', ...},
             u'89': {u'rare': u'1', u'name': u'Pogba', ...} }
然后你可以快速查看关键字u' 88'在那个数据集中。

if u'88' in Data_dict:
    print Data_dict[u'88']

要制作这样的字典,请将当前数据作为列表:

Data_dict = {val[u'rating']: val for val in Data}

答案 3 :(得分:0)

其他答案不包括您的要求,即仅ratingData出现# First iterate over Data and count how many times that rating appears counter = {} for item in Data: rating = item['rating'] counter[rating] = counter.get(rating, 0) + 1 # Now build a dict that uses rating as a key and the whole dataset with # that rating as a value. Include only ratings that appeared once in Data cleaned_dict = {item['rating']: item for item in Data if counter.get(item['rating']) == 1} query = raw_input('Enter rating:') if cleaned_dict.get(query): print "FOUND" print cleaned_dict.get(query) else: print "Not found, no need to process further" 时才会返回数据。

for

说明:
在第一个{rating: frequency}循环中,我们构建了一个counter[rating] = counter.get(rating, 0) + 1字典。第rating行说明如果0不在字典中,请将该评分设为默认计数1,并立即向其添加for。即它出现一次。但是,如果稍后在1循环中我们再次找到该评级,我们会根据该评分获得存储的值并向其添加get()。您也可以使用Counter对象,但我发现cleaned_dict的速度通常较慢。

Data中,只有在rating中出现一次评分时,我们才会使用词典理解来构建一组新数据。我们将整个原始数据存储在cleaned_data的密钥中。这允许快速查找用户输入。

最后,我们接受用户输入并在字典中查找评级。如果评分不是None中的关键字,那么我们会得到if cleaned_dict.get(query):,这是假的,因此False被解释为cleaned_dict = {} for item in Data: rating = item['rating'] is_in_dict = cleaned_dict.get(rating) if is_in_dict: position = item['position'] cleaned_dict[rating][position] = item else: sub_dict = {} sub_dict[item['position']] = item cleaned_dict[rating] = sub_dict rating_input = raw_input('Enter rating:') check_rating = cleaned_dict.get(rating_input) if check_rating: position_input = raw_input('Enter position:') if check_rating.get(position_input): print check_rating.get(position_input) else: print "Record of rating, but not position" else: print "No record of rating {}".format(rating_input)

根据评论编辑:

sqlplus -s $orcl_user/$ocle_auth@$db_orcl < $/path/extract.sql >> $path/abc.dat;