我有一个特定顺序的字母列表(想想老派发短信,所以我的按钮序列是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
答案 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