如何在Python中检查一个字符是否在字符串的特定位置?

问题描述 投票:-1回答:1

我正在做一个挂机的算法,可以很好地猜测这个词,但它并没有完全按照预期的工作。它应该是检查字符的具体位置,但它并没有真正发挥作用。例如,我就用土豚这个词。它猜对的第一个字母是a,而ardvark包含3个a,所以算法看到了这个。

aa_ _ _ _ a _ _

但是当我检查可能的单词时,大多数单词都不像这样,算法应该马上就能解决,因为只有它是唯一一个像这样的单词。

程序中有删除包含错误猜测字母的单词的功能,还有一个猜测最优字母的功能。这两个函数都能完美地工作。

这是代码中不起作用的部分,应该是检查字母的位置。

def narrowdown(guessedword, possible):
    for i in guessedword:
        if i != "_":
            for j in possible:
                k = list(j)
                if k[guessedword.index(i)] != i:
                    possible.remove(j)

这里,guessedword是猜测者能看到的字母的列表版本,而possible是猜测的单词的列表。"_"是猜词者看不到的空白字母。

每猜中一个单词后,它都会重复这个功能。

问题是,它包括了一些肯定不合格的单词。例如,我再用ardvark。

当这个词看起来像这样的时候:aa_ _ _ _。a _ _

而猜错的字母是e,i,s和u,它仍然显示这些单词。

['ardvark', 'ardvolf', 'abnormal', 'adorably', 'advocacy', 'agaragar', 'agronomy', 'anaconda', 'anaphora', 'approval', 'arrogant', 'atomb']

我说过,土豚是唯一一个符合所有这些条件的词,但算法还是要多猜3次才能找出是哪个词。

谁有办法解决这个问题?

python string position character
1个回答
0
投票

多行解法。

def narrowdown(guessedword, possible):
    res = []
    for w in possible:
        if (len(w) == len(guessedword)) and all((c1 == "_") or (c1 == c2) for c1, c2 in zip(guessedword, w)):
            res.append(w)
    return res

words = ['aardvark', 'aardwolf', 'abnormal', 'adorably', 'advocacy', 'agaragar', 'agronomy', 'anaconda', 'anaphora', 'approach', 'approval', 'arrogant', 'atombomb']
mask = "aa___a__"

print(narrowdown(mask, words))

单行方案:

def narrowdown(gw, p):
    return [w for w in p if (len(w) == len(gw)) and all((c1 == "_") or (c1 == c2) for c1, c2 in zip(gw, w))]

words = ['aardvark', 'aardwolf', 'abnormal', 'adorably', 'advocacy', 'agaragar', 'agronomy', 'anaconda', 'anaphora', 'approach', 'approval', 'arrogant', 'atombomb']
mask = "aa___a__"

print(narrowdown(mask, words))
© www.soinside.com 2019 - 2024. All rights reserved.