[英]Is there a way to see if a string matches a dictionary key and if it is print its value? python
我有一本字典:
name = {'San Francisco':'California', 'Boise':'Idaho',
'Kansas City': 'Missouri', 'Miami':'Florida'}
如果發生這種情況,我正在使用正則表達式去除城市名稱(如下)末尾的任何數字。 我想要的是讓我們說“Kansas City1”被剝離“1”,然后從那里將剝離的字符串與字典中的鍵進行比較,一旦有匹配項,我希望它返回連接到匹配的密鑰。
這是我當前的代碼:
def abbrev(string):
strip_string = re.sub(r'\d+', '', string)
if(strip_string in name.keys()):
initial = [value for value in name.values()][strip_string in name.keys()]
return initial
else:
initial = string[:3]
return initial
string = ("Kansas City1")
initial = abbrev(string)
print(initial)
所以如果堪薩斯城 1 應該給密蘇里州,但代碼出於某種原因給了我愛達荷州..我不知道為什么。 有人可以幫我解決這個問題嗎?
這是您的代碼的固定和清理版本:
import re
def abbrev(string, names):
strip_string = re.sub(r'\d', '', string)
if strip_string in names:
initial = names[strip_string]
else:
# Not sure what's the point of this?
initial = string[:3]
return initial
names = {'San Francisco': 'California',
'Boise': 'Idaho',
'Kansas City': 'Missouri',
'Miami': 'Florida'}
string = "Kansas City1"
initial = abbrev(string, names)
print(initial)
輸出:
Missouri
你的原文:
if(strip_string in name.keys()):
initial = [value for value in name.values()][strip_string in name.keys()]
真的沒有多大意義。 首先,您在 if 塊中進行了一些合理的檢查,但隨后您不僅會訪問元素,還會分配initial = List[str][bool]
。
問題出在您的 dict 參考中:
initial = [value for value in name.values()][strip_string in name.keys()]
你的第一個術語是一個新建的列表:
[value for value in name.values()]
您的索引值是一個布爾值:
[strip_string in name.keys()]
讓我們用一些簡單的跟蹤代碼來看看這個,打印每個術語:
if(strip_string in name.keys()):
print ([value for value in name.values()])
print ([strip_string in name.keys()])
initial = [value for value in name.values()][strip_string in name.keys()]
return initial
輸出:
['Idaho', 'California', 'Florida', 'Missouri']
[True]
California
您的代碼非常清楚地說明要從 dict 值構建一個列表,然后從該列表中報告元素[1]
。 你已經做了很多工作來確保你得到的東西不一定與你的輸入相關。 請注意,這將為字典中的任何鍵返回相同的值。
相反,你知道關鍵:直接使用它,因為其他人已經包含在他們的答案中。
initial = name[strip_string]
只需執行initial = name[strip_string]
而不是[value for value in name.values()][strip_string in name.keys()]
。
你已經知道strip_string
是一個有效的key,為什么不直接用它來獲取你想要的值呢?
import re
def abbrev(string):
name = {'San Francisco': 'California', 'Boise': 'Idaho', 'Kansas City': 'Missouri', 'Miami': 'Florida'}
#Remove the trailing digits from the string
strip_string = re.sub(r'\d+', '', string)
#If the key is present in the name, get the value
if strip_string in name:
initial = name[strip_string]
#Else get the first 3 characters of the input string
else:
initial = string[:3]
return initial
string = ("Kansas City1")
initial = abbrev(string)
print(initial)
輸出將是Missouri
由於以下原因,您的原始代碼無法正常工作
您的行print([value for value in name.values()])
的第一部分為您提供['California', 'Idaho', 'Missouri', 'Florida']
和您語句的第二部分[strip_string in name.keys()]
給你[True]
print([value for value in name.values()])
#['California', 'Idaho', 'Missouri', 'Florida']
print([strip_string in name.keys()])
#[True]
現在[True]
實際上評估為 1 因為int(True)=1
,因此
['California', 'Idaho', 'Missouri', 'Florida'][1]
給你Idaho
,因為列表的第二個元素是Idaho
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.