python 字典遍历同时获得键和值,关于python:遍历字典键以根据输入获取值

这篇博客讨论了如何在Python程序中处理用户输入,通过对用户输入的每个字符进行循环并查询字典来实现特定的转换。博主遇到的问题是在处理多字符输入时,程序无法返回预期的结果。解决方案包括使用字典的get方法避免KeyError,以及使用列表推导式和join方法将字符转换后的值组合成字符串。此外,还提到了避免在字典上循环查找键的效率问题。
摘要由CSDN通过智能技术生成

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)

你不应该为了找到匹配的键而在听写机上循环,这是非常低效的。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

只是为了好玩,这里有一个"功能性"版本。吉多可能不赞成这个。:)

data_input ="aaxbbcycbaz"

print(''.join(filter(None, map(data_dict.get, data_input))))

11223321

为了完整性,也许还可以演示如何使用map()?

@三倍是的,好的。;)

在我可以测试的地方没有,但是来自filter的输出不是一个可以传递给print的可选项吗?

@三倍好吧,我想你可以做一次。但OP可能需要实际的字符串。

您应该迭代输入字符串,而不是字典。另外,如果用户输入的字符不在字典中,您可能希望使用.get():

for letter in dataInput:

print(dataDict.get(letter,"X"))

这将把每个字母打印在其单独的行上。如果要以单行方式打印,可以将end=""参数添加到print函数中(完成后打印空行)。

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

你在重复错误的事情。您应该迭代输入。你不需要重复听写,因为你可以通过键查找。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值