【问题标题】:Script returns same value multiple times脚本多次返回相同的值
【发布时间】:2012-04-22 07:52:39
【问题描述】:

基本上,我有一个 Python 脚本,它需要几个字母,获取它们的每个组合,然后检查它是否是一个实际的单词(以某种方式思考拼字游戏)但由于某种原因它多次返回相同的单词,我不想这样做,脚本看起来像:

with open("dictionary.txt") as word_file:
    english_words = set(word.strip().lower() for word in word_file)

def is_english_word(word):
    return word.lower() in english_words

print is_english_word("ham")
print is_english_word("zz")

a = raw_input("Please enter first letter: ")
b = raw_input("Please enter second letter: ")
c = raw_input("Please enter third letter: ")
d = raw_input("Please enter fourth letter: ")
e = raw_input("Please enter fifth letter: ")

check =[a,b,c,d,e]

def get_combos(list):
    import itertools
    count = len(list)
    got = []
    combos =[]
    while count > 0:
        for a in itertools.permutations(list,count):
            if a in got:
                got.append(a)
            else:
                got.append(a)
                combos.append(a)
        count = count - 1
    for a in combos:
        strip_combos(a)

def strip_combos(list):
    count = ''
    words = []
    for entry in list:
        count = count + entry
        words.append(count)
    check_combo(words)

def check_combo(list):
    words = []
    got = []
    for entry in list:
        if is_english_word(entry):
            if entry not in words:
                print entry
                words.append(entry)

get_combos(check)

现在它也可以按我的意思工作,只打印字典中的单词,但它会多次打印同一个单词,例如,如果字母是:

a、c、e、s

它会在每次显示在列表中时返回,但据我所知,我通过 got 和 words 列表省略了在 check_combo 过程中多次出现的相同结果

我觉得这个问题可能源于 while 循环中的 get_combos 过程,尽管我尝试修改几乎所有内容都无济于事,所以我转向那些比我更有知识的人寻求帮助。

【问题讨论】:

  • 一些文档字符串/cmets 可能会有所帮助。例如,strip_combos 应该做什么完全不清楚。
  • 字符串已经是可迭代的。无需将其转换为列表。不要单独询问每个字母,而是:check = raw_input("Please enter 5 letter word: ")

标签: python anagram


【解决方案1】:
        if a in got:
            got.append(a)
        else:
            got.append(a)
            combos.append(a)

这几乎肯定不是你的意思:)

看来您想要做的是从排列中获得独特的结果。您这样做太复杂了,同时速度也很慢(因为您使用 list 作为查找的数据结构)。

具体来说,您想要一组结果,就像一组独特事物的数学概念一样。幸运的是,Python 内置了这个功能。

不过,你真的把整个问题弄得太复杂了,而且你的界面是错误的;你不应该是printing 结果在最内层,而是在最外层(在returning 适当的数据之后)。尽管您的级别比您需要的要多,因为您在手动处理数据列表方面做的工作太多。只需描述您想要的数据:您可以从图块中制作的“单词”集与字典中实际单词的交集。前者是从多个itertools.permutations 迭代器中获得的字母组合的字母组合结果集,您可以将它们与itertools.chain 串在一起。

def get_combos(letters):
    return set(
        ''.join(x)
        for x in itertools.chain(*(
            itertools.permutations(letters, count)
            for count in range(len(letters))
        ))
    ).intersection(english_words)

完成。

或者您可以随时过滤集合:

def get_combos(letters):
    return set(
        ''.join(x)
        for x in itertools.chain(*(
            itertools.permutations(letters, count)
            for count in range(len(letters))
        ))
        if is_english_word(''.join(x))
    )

【讨论】:

  • 太好了,非常感谢这成功了!我想知道有没有办法将另一个元素添加到列表中,以检查带有可以是任何字母的额外字母的字谜?例如,如果你有 A、C 和 E 这三个字母,那么它会表明,如果有一个额外的字母,你可以有 ACED 或 ACES?
  • 如果你可以用 A、C、E 和一个空格组成一个单词,那么你可以用 A、C 和 E 组成一个单词(去掉一个字母的单词)。所以,首先构造集合删除任何字母的英文单词,然后检查。
【解决方案2】:

这个小序列看起来不对:

        if a in got:
            got.append(a)
        else:
            got.append(a)
            # ....

如果您确实想将a 附加到got,无论选择哪个分支,请在if 块之外进行。

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2015-08-01
    相关资源
    最近更新 更多