从用户输入中减去字典中的值。 (蟒蛇)

时间:2014-08-26 08:17:22

标签: python

我正在尝试创建一个代码,用于检查邮件是否可以从文本文件中的几个句子写入,如下所示:

  

jerboa构成了Dipodidae家族的大部分成员。 Jerboas正在北非和亚洲东部和中国北部以及满洲里发现沙漠啮齿动物。他们往往在炎热的沙漠中被发现。

     

当被追赶时,jerboas可以以每小时24公里的速度奔跑。有些物种是中亚小猫头鹰(Athene noctua)的猎物。大多数种类的jerboa具有良好的听力,使他们能够避免成为这些夜行捕食者的猎物。 jerboa的典型寿命大约为6年。

到目前为止我的代码看起来像这样:

from collections import Counter
d = {}
with open("magazine.txt") as magazine:
    for line in magazine:
       magazine = str("".join(line.split()))
    magazine = list(magazine.lower())  
    magazine = Counter(magazine)
    message = input('Message: ')
    message = ''.join(message.split())
    message = list(message.lower())
    message = Counter(message)

我想看看用户输入的字符是否可以在文本文件中找到,我目前有一个计数器功能来计算字母表中每个字母的数量。如果我打印了两个变量,结果如下所示:

Counter({'s': 3, 'e': 3, 't': 2, 'm': 1, 'a': 1, 'g': 1})
Counter({'e': 34, 'a': 23, 'o': 21, 't': 18, 'r': 18, 's': 17, etc....

如果这是错的,有人可以告诉我如何正确地做到这一点吗?我想要它,以便代码从列表/字典中逐个减去输入的字母。并打印"可以打印消息"如果可以找到所有的字母和"有些字母丢失"如果找不到某些字母。 (我假设你需要一个for循环?)抱歉,我只是一个初学者。

1 个答案:

答案 0 :(得分:0)

您可以使用Counter.subtract从另一个计数器中减去一个计数器,然后检查所有计数是否为非负数。请注意,这将改变magazine就地!

magazine.subtract(message)
all_found = all(magazine[c] >= 0 for c in message)

或者,使用magazine - message,但这只会保留正数。但是,您可以检查消息中的所有字符是否仍在那里。

difference = magazine - message
all_found = all(c in difference for c in message)

另请注意,您的代码中存在一个错误:当您在循环的每次迭代中重新定义magazine时,您将只计算最后一行中的字符。试试这个:(也要短得多)。

with open("magazine.txt") as f:
    magazine = Counter(f.read())
    message = Counter(input('Message: '))

或者,如果您希望一次处理一行并且只计算小写的非空格字符:

lower_nonspace = lambda s: "".join(s.split()).lower()
with open("magazine.txt") as f:
    magazine = Counter()
    for line in f:
        magazine.update(lower_nonspace(line))
    message = Counter(lower_nonspace(input('Message: ')))