我有一個嵌套字典,其中包含一本書的標題和頁數。我想撰寫一個函式,該函式將要搜索的字典作為第一個引數,并將頁碼(作為字串)作為第二個引數。然后,該函式將搜索字典并列印與第二個引數具有相同頁數的所有書名。
這是我的字典的一個例子:
text = {
1: {
1: {"ch.name": "The Boy Who Lived", "pages": "146"},
2: {"ch.name": "The Vanishing Glass", "pages": "126"},
},
2: {
1: {"ch.name": "The Worst Birthday", "pages": "129"},
2: {"ch.name": "Dobby's Warning", "pages": "125"},
},
}
我嘗試了以下方法:
def Name(text,pages):
pages=pages
for key1, value1 in text.items():
for key2, value2 in value1.items():
output = key1,key2,value2['ch.name'],value2['pages']
output
if pages is pages:
print(f"{value2['ch.name']}")
Name(text, '125')
結果是:
The Boy Who Lived
The Vanishing Glass
The Worst Birthday
Dobby's Warning
然而,結果必須如下,因為它是唯一一本正好有 125 頁的書:
Dobby's Warning
uj5u.com熱心網友回復:
您可能希望在密鑰無關緊要的時候使用dict.values()而不是。dict.items()這可能會在以后減少一些混亂。
鑒于:
text = {
1: {1: {'ch.name': 'The Boy Who Lived', 'pages': '146'},
2: {'ch.name': 'The Vanishing Glass', 'pages': '126'}},
2: {1: {'ch.name': 'The Worst Birthday', 'pages': '129'},
2: {'ch.name': "Dobby's Warning", 'pages': '125'}}
}
正在做:
# This could easily be translated to the nested for-loops you have~
out = [y['ch.name'] for x in text.values() for y in x.values() if y['pages'] == '125']
for x in out:
print(x)
輸出:
Dobby's Warning
uj5u.com熱心網友回復:
我真的不明白你想做什么。您創建了一個輸出變數,但您不使用它變數來檢查頁碼是否對應。相反,您使用運算式if pages is pages,它總是計算為 True,因為您正在比較同一個物件。此外,該行pages=pages沒有任何效果。
我已將您的代碼修改為以下內容:
def Name(text,pages):
for key1, value1 in text.items():
for key2, value2 in value1.items():
output = key1,key2,value2['ch.name'],value2['pages']
if output[3] == pages:
print(f"{value2['ch.name']}")
我已經if pages is pages用if output[3] == pages. 現在,我們實際上將字典中的值(放入輸出變數)與引數進行比較pages。我還洗掉了第二行和第六行,因為它們沒有做任何有用的事情。
但是,如果您愿意,可以通過直接從 value2 字典中取出值來進一步簡化它。然后輸出變數變得無用:
def Name(text,pages):
for key1, value1 in text.items():
for key2, value2 in value1.items():
if value2['pages'] == pages:
print(f"{value2['ch.name']}")
另請注意,我使用的是==運算子而不是is運算子。is操作員只檢查身份。因此,僅當兩個比較物件是同一物件時,它才評估為 True。當您傳入具有相同值的兩個不同物件時,它不會評估為 True。(實際上,對于字串,這并不完全正確,請參閱此頁面了解更多資訊)==另一方面,運算子只會檢查相等性。它將比較物件的值,并在它們相同時評估為 True,否則評估為 False。它不關心物件是否相同。出于這個原因,==幾乎總是首選。
uj5u.com熱心網友回復:
與 BeRT2me 的方法相同,只需幾行而不是 1 行:
def Name(text, pages):
for dct in text.values():
for dct_2 in dct.values():
if str(pages) in dct_2.values():
print(dct_2["ch.name"])
Name(text, 125)
#
# Result: Dobby's Warning
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/527670.html
標籤:Python字典
