[英]Extracting information depending on user input from a 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
來提取信息,前提是存在另一個評分 。 編輯 : 通過這個,我的意思是,如果只顯示一行,即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
^ 這似乎根本不起作用。
好吧,在這種情況下,您需要遍歷您的值,並將輸入的值與您已有的值進行比較,對嗎?
因此player_dict
是詞典的列表,每本詞典都包含有關玩家的屬性,其中rating
為1。 另外,假設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!'
您可以使用列表推導:
[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'}]
在您的帖子中獲取數據。
另外,因為我們使用dict的.get()
方法,所以我們不必擔心異常。
您嘗試執行的操作稱為“查找”。 給定鍵(u'88'或其他評級),您需要一個值('rating'為u'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}
其他答案不包括您的要求,即僅當rating
一次出現在“ Data
,才應返回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
。 您也可以為此使用Counter
對象,但是我發現通常get()
要慢一些。
在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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.