我有字典:
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应该给密苏里州,但是代码出于某种原因却给了我爱达荷州..我不知道为什么。有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
这是您代码的固定和清理版本:
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]
。
答案 1 :(得分:3)
问题出在您的字典参考中:
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]
。您已经做了很多工作,以确保您得到的东西不一定与您的输入有关。请注意,这将为字典中的 any 键返回 same 值。
相反,您知道密钥:直接使用它,因为其他人已经在他们的答案中了。
initial = name[strip_string]
答案 2 :(得分:2)
只需initial = name[strip_string]
而不是[value for value in name.values()][strip_string in name.keys()]
。
您已经知道strip_string
是有效的密钥,为什么不使用它直接获取所需的值?
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