簡體   English   中英

根據用戶從字典中輸入的信息來提取信息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM