将一系列字母与python中的单词列表进行比较

时间:2016-10-11 00:05:08

标签: python

我有一个特定顺序的字母列表(想想老派发短信,所以我的按钮序列是4266532)

letters = [['g', 'h', 'i'], ['a', 'b', 'c'], ['m', 'n', 'o'], ['m', 'n', 'o'], ['j', 'k', 'l'], ['d', 'e', 'f']]

和单词列表

words = ['i', 'am', 'an', 'old', 'man']

我希望看到与这个单词列表相比,这个字母序列有多少匹配的句子。

例如,字母序列可以等于“我老了”。或者'我是一个古老的'

编辑:澄清我的意思是序列

在仍然有按钮而不是触摸屏的旧手机上

。每个按钮(或数字)都附有字母。例如,数字/按钮' 2'附有字母['a','b','c']。数字/按钮' 3'附有字母['d,'e','f']。因此,上面的letters列表会显示当您按4266532

时屏幕上可能出现的字母

1 个答案:

答案 0 :(得分:1)

不确定您的完整标准是什么,但由于您的列表很小,您可以执行以下操作:

from collections import Counter
from itertools import combinations, chain
letters = [['g', 'h', 'i'], ['a', 'b', 'c'], ['m', 'n', 'o'],['m', 'n', 'o'], ['j', 'k', 'l'], ['d', 'e', 'f']]
allowed = set(chain.from_iterable(letters))
words = ['i', 'am', 'an', 'old', 'man']

for phrase in combinations(words, 3):
    phrase_c = Counter(chain.from_iterable(phrase))
    if any((v > 1 and k not in "mno") or k not in allowed for k, v in phrase_c.items()):
        continue
    print(phrase)

哪会给你:

('i', 'am', 'old')
('i', 'an', 'old')
('i', 'old', 'man')

如果单词始终是字母的子集,则可以删除if k not in "mno"

如果你必须按顺序然后它更简单,只需确保短语中的每个字母都出现在子集中并且顺序正确:

from collections import Counter
from itertools import combinations, chain

letters = [['g', 'h', 'i'], ['a', 'b', 'c'], ['m', 'n', 'o'], ['m', 'n', 'o'], ['j', 'k', 'l'], ['d', 'e', 'f']]

words = ['i', 'am', 'an', 'old', 'man']

for phrase in combinations(words, 3):
    for ind, letter in enumerate(chain.from_iterable(phrase)):
         if ind >= len(letters) or letter not in letters[ind]:
            break
    else:
        print(phrase)

哪会给你:

('i', 'am', 'old')
('i', 'an', 'old')

如果您根据字母顺序对单词进行排序,并过滤掉不包含该单词中任何字母的单词,则可以降低复杂程度。您还可以考虑这样一个事实,即您最多只能创建包含6个字母的短语,即4266532