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

时间:2018-01-05 15:42:02

标签: 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 letters c, r, e, p]

在不使用正则表达式的情况下,有没有简单的方法在python中执行此操作。

2 个答案:

答案 0 :(得分:0)

我认为你需要在几个步骤中完成这项工作。

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

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]

注意for-else语法;这意味着如果循环没有中断,else子句中的代码就会执行。基本上,对于给定的字母组合,此代码检查每个单词并确定它是否仅由这些字母组成。如果是,则存储该信息。如果给定的组合没有形成任何单词,则删除其在词典中的条目(以节省内存)。请注意,这是一个非常天真的解决方案,不会很好地扩展。

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

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

答案 1 :(得分:0)

您可以使用setsitertools.combinations

来实现这一目标
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))