如果在用户输入中找到键,则从字典对象打印多个键和值

时间:2016-04-08 17:09:29

标签: python dictionary

********* ********* EDITED

所以这是我的代码的更完整版本,正如一些人评论的那样。我需要它做的是打印在user_tweet属性中找到的任何键和相应的值,该字符串是160个字符或更少的字符串。不幸的是,我可以让它做的是打印user_tweet中最后一次出现的键。

#Dictionary item

abb_dict = {
'lol': 'laughing out loud',
'bfn': 'bye for now',
'cuz': 'because',
'gtg': 'got to go',
'brb': 'be right back',
'nvm': 'nevermind',
'bff': 'best friends for ever',
'rofl': 'rolling on the floor laughing',
'omg': 'oh my god',}

user_choice = raw_input() ###Determines if user quits program


t_round = 0 #determines how many tweets have been decoded for exit message


while True:
    if user_choice == 'Q' or user_choice =='q': #quits program 
        break

#INPUT INTO user_tweet: omg shut up i gtg
    user_tweet = raw_input('Type a Tweet 160 Character or less').lower()

    if len(user_tweet) <= 160:
        for x in abb_dict:
            if x in user_tweet:
                print x , abb_dict[x]

#OUTPUT: gtg got to go

所以我遇到的问题就是它只会打印最后一次出现的键和值。 无论我放多少,都会打印出最后一张。

3 个答案:

答案 0 :(得分:0)

你的第一个解决方案是正确的。它应该输出每一场比赛,而不仅仅是最后一场比赛。我在Python中的测试:

abbrev_dict = {}
abbrev_dict['omg'] = "Oh My God!"
abbrev_dict['gtg'] = "Got to go"
input = "omg shut up I gtg"

for x in abbrev_dict:
    if x in input:
        print(x + ":" + abbrev_dict[x])

# Output:
# omg:Oh My God!
# gtg:Got to go

我的猜测是abbrev_dict的键不是小写的(例如OMG而不是omg),因此与输入(强制为小写)不匹配。尝试小写键:

abbrev_dict = {key.lower():value for key,value in abbrev_dict.items()}

答案 1 :(得分:0)

user_input被打破了。您忘记了lower调用中的括号。它实际上设置为函数,而不是下载的输入字符串。

答案 2 :(得分:0)

你的新代码在我的Python 2.6.6上运行正常,所以你只打印最后一个缩写的问题有点神秘。但是,可以对程序的逻辑进行一些改进。

首先,您应该测试用户是否想要退出主循环中的 。但你在循环之外有这个:

user_choice = raw_input() ###Determines if user quits program

并且这在循环中:

if user_choice == 'Q' or user_choice =='q': #quits program
    break

但是,由于您只在循环外设置user_choice,因此测试将始终给出相同的结果,因此当您第一次进入break循环时,您将while立即处理,不处理任何推文,或者你将陷入无限循环,你必须按 Ctrl-C 才能逃脱。

您的主处理循环可以找到错误匹配:它将打印嵌入在较长单词内的键,这可能不是您想要的。例如,如果user_tweet包含&#34; jacuzzi&#34;那么它将被&#34; cuz&#34;匹配。

此外,主处理循环效率低下。

for x in abb_dict:
    if x in user_tweet:

为每条推文遍历整个abb_dict,然后if in测试必须通过推文线性扫描,以查找来自abb_dict的当前密钥的匹配项。现在,if x in user_tweet 非常快,因为它以C速度运行,这意味着它比以Python速度扫描更快,但它仍然效率低下。

此外,您的代码按照它们存储在字典中的顺序打印缩写,这些缩写可能与您在字典定义中列出它们的顺序相同(由于Python字典的方式)工作)。

更好的策略是将推文拆分为单词列表,然后测试每个单词是否在abb_dict中。这样,您只需通过推文线性扫描两次,一次将其拆分为一个列表,一次根据字典测试列表中的每个单词。并且测试密钥是否在字典中是非常快速和有效的,因为它不扫描整个字典以寻找匹配。此外,通过此策略,您可以按照它们在推文中出现的顺序获得缩写列表。

以下是代码的改进版本:

abb_dict = {
    'lol': 'laughing out loud',
    'bfn': 'bye for now',
    'cuz': 'because',
    'gtg': 'got to go',
    'brb': 'be right back',
    'nvm': 'nevermind',
    'bff': 'best friends for ever',
    'rofl': 'rolling on the floor laughing',
    'omg': 'oh my god',
}

#determines how many tweets have been decoded for exit message
t_round = 0

while True:
    user_tweet = raw_input('Type a Tweet of 160 characters or less, or q to quit: ')
    if user_tweet in "Qq":
        break

    if len(user_tweet) > 160:
        continue

    for word in user_tweet.lower().split():
        if word in abb_dict:
            print '%s: %r' % (word, abb_dict[word])

    t_round += 1

print t_round, 'tweets processed.'

<强>测试

Type a Tweet of 160 characters or less, or q to quit: omg shut up i gtg
omg: 'oh my god'
gtg: 'got to go'
Type a Tweet of 160 characters or less, or q to quit: LOL dude brb I gtG
lol: 'laughing out loud'
brb: 'be right back'
gtg: 'got to go'
Type a Tweet of 160 characters or less, or q to quit: q
2 tweets processed.

请注意,此代码处理混合大小写,以及单词之间的各种空白量,但它不会处理附加了多个标点符号的缩写。此外,如果在推文中多次出现相同的缩写,则会多次打印。如果不需要,您可以使用set存储匹配项,只有在set中尚未存在匹配项时才打印匹配项。像这样:

matches = set()
for word in user_tweet.lower().split():
    if word in abb_dict and word not in matches:
        print '%s: %r' % (word, abb_dict[word])
        matches.add(word)

<强>测试

Type a Tweet of 160 characters or less, or q to quit: lol dude brb i GTG LOL brb gtg nvm
lol: 'laughing out loud'
brb: 'be right back'
gtg: 'got to go'
nvm: 'nevermind'
Type a Tweet of 160 characters or less, or q to quit: Q
1 tweets processed.

或者,您可以将matches = set()移至while True之前,以保留所有推文的匹配,以便只打印每条推文中的新缩写。

稍微更改代码,我们就可以通过扩展来替换缩写:

abb_dict = {
    'lol': 'laughing out loud',
    'bfn': 'bye for now',
    'cuz': 'because',
    'gtg': 'got to go',
    'brb': 'be right back',
    'nvm': 'nevermind',
    'bff': 'best friends for ever',
    'rofl': 'rolling on the floor laughing',
    'omg': 'oh my god',
}

#determines how many tweets have been decoded for exit message
t_round = 0

while True:
    user_tweet = raw_input('Type a Tweet of 160 characters or less, or q to quit: ')
    if user_tweet in "Qq":
        break

    if len(user_tweet) > 160:
        continue

    words = []
    for word in user_tweet.split():
        word = abb_dict.get(word.lower(), word)
        words.append(word)

    print ' '.join(words)
    t_round += 1

print t_round, 'tweets processed.'    

<强>测试

Type a Tweet of 160 characters or less, or q to quit: lol dude brb i GTG LOL brb gtg nvm
laughing out loud dude be right back i got to go laughing out loud be right back got to go nevermind
Type a Tweet of 160 characters or less, or q to quit: q
1 tweets processed.

通过使用列表解析,可以缩小中央循环(并且稍微提高效率):

while True:
    user_tweet = raw_input('Type a Tweet of 160 characters or less, or q to quit: ')
    if user_tweet in "Qq":
        break

    if len(user_tweet) > 160:
        continue

    print ' '.join([abb_dict.get(word.lower(), word) 
        for word in user_tweet.split()])
    t_round += 1

现在看看你是否可以修改这些代码,以便处理标点符号。 :)