基于字符列表列表的单词组合

时间:2016-01-18 19:30:20

标签: python combinations itertools

我得到了多个数字的集合,例如6837.我有一个字典,基本上说我可以为每个数字使用哪些字符,基本上是电话键上的数字,如下所示:

letters = {
    "2": ["a","b","c"],
    "3":["d",'e','f'],
    '4':['g','h','i'],
    '5':['j','k','l'],
    '6':['m','n','o'],
    '7':['p','q','r','s'],
    '8':['t','u','v'],
    '9':['w','x','y','z']}

所以我创建了一个列表列表,以显示每组数字的含义以及我所拥有的6837:

[['m', 'n', 'o'], ['t', 'u', 'v'], ['d', 'e', 'f'], ['p', 'q', 'r', 's']]

所以我需要将所有可能的单词组合在一起 第一个字符必须是:m或n或o 第二个字符:t或u或v 等等。 我试过itertools.combinations,但没有做对。我可以蛮力夺取每个角色并按顺序追加其余角色并创建一个单词列表。但是必须有一种python方式来做到这一点非常干净。感谢您的所有投入。

2 个答案:

答案 0 :(得分:3)

首先为您给定的数字创建一个合适的字母列表,然后使用Python的itertools.product为这些字母创建所有可用的组合,如下所示:

from itertools import product

letters = [[""], [""], ["a","b","c"], ["d",'e','f'], ['g','h','i'],
    ['j','k','l'], ['m','n','o'], ['p','q','r','s'], ['t','u','v'], ['w','x','y','z']]

for combo in product(*(letters[x] for x in [6,8,3,7])):
    print combo

对于6837,您将获得以下输出:

('m', 't', 'd', 'p')
('m', 't', 'd', 'q')
('m', 't', 'd', 'r')
('m', 't', 'd', 's')
('m', 't', 'e', 'p')
('m', 't', 'e', 'q')
('m', 't', 'e', 'r')
('m', 't', 'e', 's')
('m', 't', 'f', 'p')
('m', 't', 'f', 'q')
('m', 't', 'f', 'r')
('m', 't', 'f', 's')
('m', 'u', 'd', 'p')
('m', 'u', 'd', 'q')
('m', 'u', 'd', 'r')
('m', 'u', 'd', 's')
('m', 'u', 'e', 'p')
('m', 'u', 'e', 'q')
('m', 'u', 'e', 'r')
('m', 'u', 'e', 's')
('m', 'u', 'f', 'p')
('m', 'u', 'f', 'q')
('m', 'u', 'f', 'r')
('m', 'u', 'f', 's')
('m', 'v', 'd', 'p')
('m', 'v', 'd', 'q')
('m', 'v', 'd', 'r')
('m', 'v', 'd', 's')
('m', 'v', 'e', 'p')
('m', 'v', 'e', 'q')
('m', 'v', 'e', 'r')
('m', 'v', 'e', 's')
('m', 'v', 'f', 'p')
('m', 'v', 'f', 'q')
('m', 'v', 'f', 'r')
('m', 'v', 'f', 's')
('n', 't', 'd', 'p')
('n', 't', 'd', 'q')
('n', 't', 'd', 'r')
('n', 't', 'd', 's')
('n', 't', 'e', 'p')
('n', 't', 'e', 'q')
('n', 't', 'e', 'r')
('n', 't', 'e', 's')
('n', 't', 'f', 'p')
('n', 't', 'f', 'q')
('n', 't', 'f', 'r')
('n', 't', 'f', 's')
('n', 'u', 'd', 'p')
('n', 'u', 'd', 'q')
('n', 'u', 'd', 'r')
('n', 'u', 'd', 's')
('n', 'u', 'e', 'p')
('n', 'u', 'e', 'q')
('n', 'u', 'e', 'r')
('n', 'u', 'e', 's')
('n', 'u', 'f', 'p')
('n', 'u', 'f', 'q')
('n', 'u', 'f', 'r')
('n', 'u', 'f', 's')
('n', 'v', 'd', 'p')
('n', 'v', 'd', 'q')
('n', 'v', 'd', 'r')
('n', 'v', 'd', 's')
('n', 'v', 'e', 'p')
('n', 'v', 'e', 'q')
('n', 'v', 'e', 'r')
('n', 'v', 'e', 's')
('n', 'v', 'f', 'p')
('n', 'v', 'f', 'q')
('n', 'v', 'f', 'r')
('n', 'v', 'f', 's')
('o', 't', 'd', 'p')
('o', 't', 'd', 'q')
('o', 't', 'd', 'r')
('o', 't', 'd', 's')
('o', 't', 'e', 'p')
('o', 't', 'e', 'q')
('o', 't', 'e', 'r')
('o', 't', 'e', 's')
('o', 't', 'f', 'p')
('o', 't', 'f', 'q')
('o', 't', 'f', 'r')
('o', 't', 'f', 's')
('o', 'u', 'd', 'p')
('o', 'u', 'd', 'q')
('o', 'u', 'd', 'r')
('o', 'u', 'd', 's')
('o', 'u', 'e', 'p')
('o', 'u', 'e', 'q')
('o', 'u', 'e', 'r')
('o', 'u', 'e', 's')
('o', 'u', 'f', 'p')
('o', 'u', 'f', 'q')
('o', 'u', 'f', 'r')
('o', 'u', 'f', 's')
('o', 'v', 'd', 'p')
('o', 'v', 'd', 'q')
('o', 'v', 'd', 'r')
('o', 'v', 'd', 's')
('o', 'v', 'e', 'p')
('o', 'v', 'e', 'q')
('o', 'v', 'e', 'r')
('o', 'v', 'e', 's')
('o', 'v', 'f', 'p')
('o', 'v', 'f', 'q')
('o', 'v', 'f', 'r')
('o', 'v', 'f', 's')

答案 1 :(得分:2)

使用itertools.product

from itertools import product

def keypad(number):
    letters = {'2':['a', 'b', 'c'],
               '3':['d', 'e', 'f'],
               '4':['g', 'h', 'i'],
               '5':['j', 'k', 'l'],
               '6':['m', 'n', 'o'],
               '7':['p', 'q', 'r', 's'],
               '8':['t', 'u', 'v'],
               '9':['w', 'x', 'y', 'z']}
    return [''.join(i) for i in product(*[letters[i] for i in number])]


if __name__ == "__main__":
    words = keypad('6837')
    print(words)

打印哪些:

['mtdp', 'mtdq', 'mtdr', 'mtds', 'mtep', 'mteq', 'mter', 'mtes', 'mtfp', 'mtfq', 'mtfr', 'mtfs', 'mudp', 'mudq', 'mudr', 'muds', 'muep', 'mueq', 'muer', 'mues', 'mufp', 'mufq', 'mufr', 'mufs', 'mvdp', 'mvdq', 'mvdr', 'mvds', 'mvep', 'mveq', 'mver', 'mves', 'mvfp', 'mvfq', 'mvfr', 'mvfs', 'ntdp', 'ntdq', 'ntdr', 'ntds', 'ntep', 'nteq', 'nter', 'ntes', 'ntfp', 'ntfq', 'ntfr', 'ntfs', 'nudp', 'nudq', 'nudr', 'nuds', 'nuep', 'nueq', 'nuer', 'nues', 'nufp', 'nufq', 'nufr', 'nufs', 'nvdp', 'nvdq', 'nvdr', 'nvds', 'nvep', 'nveq', 'nver', 'nves', 'nvfp', 'nvfq', 'nvfr', 'nvfs', 'otdp', 'otdq', 'otdr', 'otds', 'otep', 'oteq', 'oter', 'otes', 'otfp', 'otfq', 'otfr', 'otfs', 'oudp', 'oudq', 'oudr', 'ouds', 'ouep', 'oueq', 'ouer', 'oues', 'oufp', 'oufq', 'oufr', 'oufs', 'ovdp', 'ovdq', 'ovdr', 'ovds', 'ovep', 'oveq', 'over', 'oves', 'ovfp', 'ovfq', 'ovfr', 'ovfs']