查找字谜生成器

2024-10-04 13:24:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串列表,如:

beel beez baee beae

我需要找到所有单词(如果存在的话)中共同的单词(或其拼字法)。 在这种情况下,神奇的词语是:

bee

或其字谜(例如:ebe,eeb)

我的解决办法是:

我比较了他们之间的所有词语:

def es(list_str):
    for i in range(len(list_str)):
        a = list_str[i]
        for j in range(i+1, len(list_str)):
            b = list_str[j]

然后我搜索这个神奇的词:

def generator(a,b):
    res = []
    a = list(a)
    b = list(b)
    for i in a:
        if i in b:
            res.append(i)
            b.remove(i)
    return sorted(res)

实际上我的代码很好用,我找到了我需要的。问题是,对于很长的字符串列表,它的效率很低

有人知道如何找到这个词吗?我不能使用专门的图书馆,这是大学的家庭作业


Tags: 字符串in列表forlendefrangeres
2条回答

一种方法是使用集合找到所有单词的公共字母,然后计算单词中每个字母的最小出现次数:

words = 'beel beez baee beae'.split()
common_letters = set.intersection(*(set(word) for word in words))
occurences = {letter: min(word.count(letter) for word in words) for letter in common_letters}
common_word = ''.join([letter * occurences[letter] for letter in common_letters])

print(common_word)
# bee

使用collections.Counter来避免重复计算同一单词的稍微高效的版本:

from collections import Counter

words = 'beel beez baee beae'.split()
counts = [Counter(word) for word in words]
common_letters = set.intersection(*(set(c.keys()) for c in counts))
occurences = {letter: min(count[letter] for count in counts) for letter in common_letters}
common_word = ''.join([letter * occurences[letter] for letter in common_letters])

print(common_word)
# bee

如果你只是在寻找每个单词中出现的字母列表,顺序无关紧要,那么数一数每个单词中的字母,找出出现次数最少的单词中出现的次数,然后用这些字母创建一些单词

from collections import Counter

words = ["beel", "beez", "baee", "beae"]

letter_counts = [Counter(word) for word in words]
shared_letters = {
    letter: min(counts[letter] for counts in letter_counts) for letter in words[0]
}
print("".join(letter * count for letter, count in shared_letters.items()))

相关问题 更多 >