【问题标题】:Loop through dictionary keys to get values based on input遍历字典键以根据输入获取值
【发布时间】:2017-12-09 08:11:45
【问题描述】:

1) 在我的程序中,我首先提示用户输入。

2) 然后我想遍历用户输入以获取该字符串中的所有字符,根据字典键单独查询每个字符。

3) 如果输入中的字符与字典中的键匹配,我希望返回该键的值。

4) 需要对每个字符重复此操作,结果应打印字符串中返回的那些值

为了进一步解释,这是我的字典:

dataDict = {
"a":"1",
"b":"2",
"c":"3",
}

例如:

如果我的输入是 abc,我的结果应该是 123

如果我的输入是 cba,我的结果应该是 321

等等……

到目前为止,如果字符串只有一个字符,则可以使用以下代码。 如果我输入两个字符,它什么也不返回。

dataInput=input("Enter stuff: ")

for key,value in dataDict.items():
    if dataInput == key:
    print(value)

我怎样才能达到我想要的结果?

【问题讨论】:

  • dataInput 是否总是包含所有值或"12" 也是可能的?
  • "".join(a.get(key, "") for key in w)

标签: python python-3.x dictionary


【解决方案1】:

您不应该循环遍历字典来查找匹配的键,这是 非常 低效的。 dict 旨在进行快速查找:你给它键,它给你价值。例如,dataDict["a"] 结果为“1”。

另外,正如 Tim Pietzcker 所提到的,只有当 dataInput 包含一个字母时,if dataInput == key 才有效,因为它将整个 dataInput 字符串与 key 进行比较。

这是进行所需转换的简单方法。我们在列表推导中进行查找,它创建一个转换值的列表,然后我们将该列表传递给.join 以创建一个字符串。 (我已经更改了变量的名称以符合 PEP-008 样式指南)。

data_dict = {
    "a": "1",
    "b": "2",
    "c": "3",
}

data_input = "aabbccba"

s = ''.join([data_dict[c] for c in data_input])
print(s)

输出

11223321

但是,这并不安全:如果 data_input 包含不在字典中的字符,它将失败并显示 KeyError。这是一个更好的方法:如果它得到一个坏字符,它会添加一个空字符串。

data_input = "aaxbbcycbaz"
s = ''.join([data_dict.get(c, '') for c in data_input])
print(s)

输出

11223321

或者,我们可以将不良数据转换为一些特殊值,例如 0。

data_input = "aaxbbcycbaz"
s = ''.join([data_dict.get(c, '0') for c in data_input])
print(s)

输出

11022303210

只是为了好玩,这里有一个“功能性”版本。 Guido 可能不会赞成这个。 :)

data_input = "aaxbbcycbaz"
print(''.join(filter(None, map(data_dict.get, data_input))))
11223321

【讨论】:

  • 为了完整起见,也许也可以用map() 来展示如何做到这一点?
  • @tripleee 是的,好的。 ;)
  • 不是我可以测试的地方,但filter 的输出不是可以传递给print 的可迭代对象吗?
  • @tripleee 好吧,我想你可以做到print(*filter(None, map(data_dict.get, data_input)), sep='')。但 OP 可能需要实际的字符串。
【解决方案2】:

您应该遍历输入字符串,而不是字典。此外,您可能需要使用.get(),以防用户输入的字符不在字典中:

for letter in dataInput:
    print(dataDict.get(letter,"X"))

这将在其单独的行上打印每个字母。如果您想将它们打印在一行中,可以将end="" 参数添加到print 函数中(并在完成后打印一个空行)。

您所做的比较永远不会奏效(在第一次迭代中,它将等于 if "abc" == "a",我希望这很明显)。

【讨论】:

    【解决方案3】:

    你在迭代错误的东西。您应该遍历输入。您不需要遍历 dict,因为您可以通过键查找。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2015-09-27
      • 2015-10-25
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多