有没有办法查看字符串是否与字典键匹配,以及是否显示其值?蟒蛇

时间:2019-05-01 18:17:26

标签: python python-3.x dictionary

我有字典:

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应该给密苏里州,但是代码出于某种原因却给了我爱达荷州..我不知道为什么。有人可以帮我解决这个问题吗?

3 个答案:

答案 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