Python 如何检查字符串是否在集合中

Python 如何检查字符串是否在集合中,python,Python,编辑: 我之所以会得到奇怪的结果,是因为我正在使用的字典()包含了许多不是真正的单词的值。我下面的代码都能正常工作。我以为这是因为words中的if单词,但我错了 这是我的代码: cipher = (input('what is your cipher? ')) alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] s

编辑: 我之所以会得到奇怪的结果,是因为我正在使用的字典()包含了许多不是真正的单词的值。我下面的代码都能正常工作。我以为这是因为words中的
if单词,但我错了

这是我的代码:

cipher = (input('what is your cipher? '))
alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
shift = 0
score=0
answer=''
scores=[]
answers=[]
with open('smalldic.txt') as word_file:
    words2 = set(word_file.read().lower().split())
with open('bigdic.txt') as word_file:
    words = set(word_file.read().split()) 
while shift<26:                           
    shift+=1
    for letter in cipher:                 
        try:
            answer+=alphabet[(alphabet.index(letter)+shift)%26]
        except ValueError:
            answer+=letter
    answer = answer.split()
    for word in answer:
        if word in words:
            score+=len(word)*13
            if word in words2:
                score+=len(word)*26           
    scores.append(score)
    answers.append(answer)
    answer=''
    score=0
maxscore=max(scores)
count=-1
for i in scores:
    count+=1
    if i==maxscore:
        print(i)
        print(answers[count])
pause=input('Press any key to finish')

你的代码对我来说很好。 你确定问题不在柜台上吗? 下面的代码为我返回“2”,就像应该返回的那样:

answer = ['j', 'mpwf', 'taub', 'tubdl', 'tuba', 'pwfsgmpx', 'apple']
 words = {'jam', 'jelly', 'tuba', 'apple'}
 score = 0
 for word in answer:
     if word in words:
         score += 1
 print(score)

你的代码对我来说很好。 你确定问题不在柜台上吗? 下面的代码为我返回“2”,就像应该返回的那样:

answer = ['j', 'mpwf', 'taub', 'tubdl', 'tuba', 'pwfsgmpx', 'apple']
 words = {'jam', 'jelly', 'tuba', 'apple'}
 score = 0
 for word in answer:
     if word in words:
         score += 1
 print(score)

正如roganjosh所观察到的,你描述的行为并没有发生

您提供了一个两个字母的输入单词,
“it”
。我的字典列出了160个“有效”的两个字母组合,几乎是676个可能组合的四分之一。我不知道你到底用了什么输入词典,但这种效果可能会导致产生大量
1
分数。例如,我注意到“mw”可能对应兆瓦,另外我在输出中看到一些两个字母的国家代码。我使用的字典是OS/X提供的
/usr/share/dict/words

要进行调试,只需在增加分数后使用print语句:

    for word in answer:
        if word in words:
            score += 1
            print(word)
这将突出显示“令人惊讶的”
word

Python的
in
操作符的行为完全正确

编辑:

人们大多编译单词列表以支持拼写检查应用程序,这将倾向于在包含所有内容的同时出错。谷歌搜索一下就可以得到很多单词列表,但我从infochimps抓到的第一个单词列表却有427个双字母单词,令人印象深刻的63%。也许会被证明是相关的

您可能希望使用附带的(与平台无关的)代码来访问相当合理的英语单词语料库

#! /usr/bin/env python

# You will need: pip install pyenchant
import enchant


def letters():
    return range(ord('a'), ord('z') + 1)


def get_2_letter_words():
    for a in letters():
        for b in letters():
            yield chr(a) + chr(b)


def num_valid_2_letter_words():
    d = enchant.Dict("en_US")
    return sum(d.check(word) for word in get_2_letter_words())


if __name__ == '__main__':
    n = num_valid_2_letter_words()
    print(n, n / 26 ** 2)
你真正想要的是单克频率。也就是说,与基于某个布尔
check()
函数为两个字母的单词打分相比,您更愿意为像
'it'
这样的普通单词打分,而为像
'id'
'mw'
这样的不太常见的单词打分

我比较喜欢Dunes的建议,即更多地关注较长的单词。假设我们缺少单字符频率数字,因此被迫在n个字母的单词上采用统一的优先级,例如,
'it'
'id'
同样可能出现在纯文本中。计算字典中n个字母的单词数,除以
26**n
,然后在评分中使用该分数


.suggest()
相结合将提高对明文打字错误的弹性。

正如罗甘约什所观察到的,您描述的行为不会发生

您提供了一个两个字母的输入单词,
“it”
。我的字典列出了160个“有效”的两个字母组合,几乎是676个可能组合的四分之一。我不知道你到底用了什么输入词典,但这种效果可能会导致产生大量
1
分数。例如,我注意到“mw”可能对应兆瓦,另外我在输出中看到一些两个字母的国家代码。我使用的字典是OS/X提供的
/usr/share/dict/words

要进行调试,只需在增加分数后使用print语句:

    for word in answer:
        if word in words:
            score += 1
            print(word)
这将突出显示“令人惊讶的”
word

Python的
in
操作符的行为完全正确

编辑:

人们大多编译单词列表以支持拼写检查应用程序,这将倾向于在包含所有内容的同时出错。谷歌搜索一下就可以得到很多单词列表,但我从infochimps抓到的第一个单词列表却有427个双字母单词,令人印象深刻的63%。也许会被证明是相关的

您可能希望使用附带的(与平台无关的)代码来访问相当合理的英语单词语料库

#! /usr/bin/env python

# You will need: pip install pyenchant
import enchant


def letters():
    return range(ord('a'), ord('z') + 1)


def get_2_letter_words():
    for a in letters():
        for b in letters():
            yield chr(a) + chr(b)


def num_valid_2_letter_words():
    d = enchant.Dict("en_US")
    return sum(d.check(word) for word in get_2_letter_words())


if __name__ == '__main__':
    n = num_valid_2_letter_words()
    print(n, n / 26 ** 2)
你真正想要的是单克频率。也就是说,与基于某个布尔
check()
函数为两个字母的单词打分相比,您更愿意为像
'it'
这样的普通单词打分,而为像
'id'
'mw'
这样的不太常见的单词打分

我比较喜欢Dunes的建议,即更多地关注较长的单词。假设我们缺少单字符频率数字,因此被迫在n个字母的单词上采用统一的优先级,例如,
'it'
'id'
同样可能出现在纯文本中。计算字典中n个字母的单词数,除以
26**n
,然后在评分中使用该分数


.suggest()
相结合将提高对明文打字错误的弹性。

您可以添加和预期输出吗?您描述的行为不会发生。
“j”
不应该与
单词集中的任何内容相匹配,就像您在此处提供的那样。您的原始代码、原始
单词或
答案
变量(您可能遗漏了这些变量)或您增加分数变量的方式有问题。您是否可以添加和预期输出?您描述的行为不会发生。
“j”
不应与
单词集
中的任何内容相匹配,即您在此处提供的方式。您的原始代码、原始的
单词
答案
变量可能有问题,或者您增加分数变量的方式有问题。Zoran先生,您的单词可能不是最大的问题。也许问题在于你如何得分。匹配6个字母的单词应该比匹配2个字母的单词更有价值。它的价值应该至少和匹配三个两个字母的单词一样高!但是你现在的算法给了他们同等的权重