递归Python函数,用于打印从数字键盘中选择数字的所有字母组合



我正在尝试获取从小键盘中选择数字的所有字母组合。例如;

如果我按 2(abc( 和 3(def(,那么 ad,ae,af,bd,be,bf,cd,ce,cf,abd,abe,........所有组合。

我正在尝试使用递归函数来制作它,但我卡住了,我把这个错误TypeError: 'int' object is not iterable.谁能帮我?

A = {
'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']
}
def combination(numbers,data,strout = ''):
x = len(numbers)
print(x)
if x >= 1:
for i in range(x):
y = numbers[i:i+1]
for k in len(data[y]):
combination(numbers[i:i+1], data,strout = strout+(data[y][k],))
else:
return '0'

combination('235', A,'')

使用itertools.product和解包运算符是一种可能的方法:

from itertools import product
def combination(numbers, data):
letters = product(*[''.join(data[number]) for number in numbers])
return ','.join(''.join(item).lower() for item in letters)

演示:

In [184]: A = {'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']}
...: 
In [185]: combination('', A)
Out[185]: ''
In [186]: combination('2', A)
Out[186]: 'a,b,c'
In [187]: combination('23', A)
Out[187]: 'ad,ae,af,bd,be,bf,cd,ce,cf'
In [188]: combination('235', A)
Out[188]: 'adj,adk,adl,aej,aek,ael,afj,afk,afl,bdj,bdk,bdl,bej,bek,bel,bfj,bfk,bfl,cdj,cdk,cdl,cej,cek,cel,cfj,cfk,cfl'

编辑

根据您的要求,我附加了另外两个不依赖于itertools模块的解决方案:

def it_combination(numbers, data):
'''Iterative cartesian product'''
values = [data[key] for key in numbers]
result = [[]]
for letters in values:
result = [lst + [letter] for lst in result for letter in letters]
return ','.join(''.join(seq).lower() for seq in result)
def rec_combination(numbers, data):
'''Recursive cartesian product'''
def wrapped(numbers, data, result=[[]]):
if not numbers:
return result
else:
letters = data[numbers[0]]
result = [lst + [letter] for lst in result for letter in letters]
return wrapped(numbers[1:], data, result)
return ','.join(''.join(seq).lower() for seq in wrapped(numbers, data))

示例运行:

In [190]: combination('', A) == it_combination('', A) == rec_combination('', A)
Out[190]: True
In [191]: combination('2', A) == it_combination('2', A) == rec_combination('2', A)
Out[191]: True
In [192]: combination('23', A) == it_combination('23', A) == rec_combination('23', A)
Out[192]: True
In [193]: combination('235', A) == it_combination('235', A) == rec_combination('235', A)
Out[193]: True

最新更新