如何检查一个字符是否在Python中的字符串中的特定位置?
How to check if a character is in a specific position in a string in Python?
我正在为刽子手制作一个算法,它可以很好地猜出这个词,但它并没有完全按预期工作。它应该检查字符的特定位置,但它并没有真正起作用。例如,我将使用 aardvark 这个词。它猜对的第一个字母是 a,aardvark 包含 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是猜出的单词可能是的单词列表。 “_”是猜测者看不到的空白字母。
每次猜到一个单词后,它都会重复这个函数。
问题在于它包含绝对不符合条件的词。例如,我将再次使用 aardvark。
当单词看起来像这样:aa_ _ _ a _ _
而猜错的字母是e、i、s、u,它仍然显示这些字:
['aardvark', 'aardwolf', 'abnormal', 'adorably', 'advocacy', 'agaragar', 'agronomy', 'anaconda', 'anaphora', 'approach', 'approval', 'arrogant', 'atombomb']
正如我所说,aardvark 是唯一满足所有这些条件的词,但该算法仍需要再进行 3 次猜测才能找出它是哪个词。
有人知道如何解决这个问题吗?
多行解决方案:
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))
我正在为刽子手制作一个算法,它可以很好地猜出这个词,但它并没有完全按预期工作。它应该检查字符的特定位置,但它并没有真正起作用。例如,我将使用 aardvark 这个词。它猜对的第一个字母是 a,aardvark 包含 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是猜出的单词可能是的单词列表。 “_”是猜测者看不到的空白字母。
每次猜到一个单词后,它都会重复这个函数。
问题在于它包含绝对不符合条件的词。例如,我将再次使用 aardvark。
当单词看起来像这样:aa_ _ _ a _ _
而猜错的字母是e、i、s、u,它仍然显示这些字:
['aardvark', 'aardwolf', 'abnormal', 'adorably', 'advocacy', 'agaragar', 'agronomy', 'anaconda', 'anaphora', 'approach', 'approval', 'arrogant', 'atombomb']
正如我所说,aardvark 是唯一满足所有这些条件的词,但该算法仍需要再进行 3 次猜测才能找出它是哪个词。
有人知道如何解决这个问题吗?
多行解决方案:
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))