所以这是我的代码的更完整版本,正如一些人评论的那样。我需要它做的是打印在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
所以我遇到的问题就是它只会打印最后一次出现的键和值。 无论我放多少,都会打印出最后一张。
答案 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
现在看看你是否可以修改这些代码,以便处理标点符号。 :)