我从.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
^ 这根本不起作用。
答案 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)
其他答案不包括您的要求,即仅rating
仅Data
出现# 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;