Python 在单词列表中查找常用字母

Python 在单词列表中查找常用字母,python,Python,我是python新手这是我试图实现的目标: letter = 4 word = "Demo Deer Deep Deck Cere Reep Creep Creeps" split_word = word.split() 我正在尝试实现可以由任意4个常用字母组成的单词,例如: Deer Deep Reep [these can be formed by 4 letters d, e, r & p] Creep Cere Reep [these can be formed by 4

我是python新手这是我试图实现的目标:

letter = 4
word = "Demo Deer Deep Deck Cere Reep Creep Creeps"
split_word = word.split()   
我正在尝试实现可以由任意4个常用字母组成的单词,例如:

Deer Deep Reep [these can be formed by 4 letters d, e, r & p]
Creep Cere Reep [these can be formed by 4 letters c, r, e, p]

在python中有没有不使用regex的简单方法来实现这一点。

我认为,您需要通过几个步骤来实现这一点

首先,你需要弄清楚你的一组字母是什么。你可以使用整个字母表,但如果你能避免的话,我建议你不要这样做。我会尝试使用一套:

letter_pool = set([ltr.lower() for ltr in word if ltr != " "])
接下来,您需要遍历池中四个字母的所有组合,并检查哪些单词可以由它们组成。这就是为什么最好不要使用整个字母表;这是许多组合。在下面的示例中,我将结果存储在一个由字母组合键入的字典中,但是您可以根据需要修改它

results = {}
import itertools
for combination in itertools.combinations(letter_pool, letter): #in this case, letter=4
   results[combination] = []
   for wrd in split_word:
      for character in wrd:
         if character.lower() not in combination:
            break
      else:
         results[combination].append(wrd)
   if len(results[combination]) == 0:
      del results[combination]
注意else的
语法;这意味着如果循环没有中断,则执行
else
子句中的代码。基本上,对于给定的字母组合,该代码检查每个单词并确定它是否仅由这些字母组成。如果是,则存储该信息。如果给定的组合没有形成任何单词,那么它在字典中的条目将被删除(以节省内存)。请注意,这是一个非常简单的解决方案,不能很好地扩展

如果要打印结果,可以执行以下操作:

for key in results:
   print ", ".join(results[key]), " [ formed by "+str(key)+"]"

您可以通过以下方式实现此目的:


在你的第一个和第三个例子中,“derep”与所涉及的单词有何共同之处?“Deep”没有“r”,而“Reep”没有“d”。我不明白你是如何定义普通字母的。Deer、deep和reep有一个共同的字母,即E。Cere、reep和Screw有两个共同的字母,E和R。等等???@leeum字母如果出现在一个以上的单词中,就被认为是共同的(我认为)。你在这里想要什么真的没有意义。@RoadRunner:对不起,让我再考虑一下,我正在尝试用4个字母组成的单词,比如deer、err、deep和peer[在本例中是d、e、r&p]。我想我没能解释清楚。我会更新我的问题。
word = "Demo Deer Deep Deck Cere Reep Creep Creeps"
split_word = word.split() 

from itertools import combinations

letters = {s for it in split_word for s in it.lower()}
out = dict()
for n in range(len(letters)):
    out[n] = {''.join(letters_subset): [word
                                        for word in split_word
                                        if set(word.lower()).issubset(letters_subset)]
          for letters_subset in combinations(letters, n)}
    out[n] = {k: v for k, v in out[n].items() if len(v) > 0}

# Print output
for n, d in out.items():
    for k, v in d.items():
        print('{}:\t{}\t{}'.format(n, k, v))