0

鉴于这本词典

dictt={2:'abc',3:'def',4:'gfi',5:'jkl',6:'mno',7:'pqrs',8:'tuv',9:'wxyz'}

我需要做一个自定义排列。

输入中的数字将告诉您输出将持续多长时间。

输入还将指向正在排列的字母。

例如。“34”将使程序返回第一个序列的第一个字母,并将第二个序列的所有3个字母一个接一个地相加。a+d=ad a+e=ae a+d=af 那么它将取第一个序列的第二个字母并添加第二个序列的所有 3 个字母 b+d=bd b+e=be b+f=bf然后第三个字母 c+d=cd c+e=ce c+f=cf 所以当你输入 34 时,如果输入是 3 个数字,它将返回 ad ae af bd be bf cd ce cf。那么输出将是 3 对。如果输入是一个数字。那么输出将只是列出的相应序列。ex: "2" would return a b c

def permuteString(numString):
    array=[]
    original={2:'abc',3:'def',4:'gfi',5:'jkl',6:'mno',7:'pqrs',8:'tuv',9:'wxyz'}
    for a,b in original.iteritems():
        print a,b
        for c in b:
            print c

    return array

stuff=permuteString("234")

到目前为止,我所做的只是把字典拿出来

4

2 回答 2

3

写成生成器类:

import itertools

class PhoneWords(object):
    letters = {
        2: 'abc',
        3: 'def',
        4: 'ghi',
        5: 'jkl',
        6: 'mno',
        7: 'pqrs',
        8: 'tuv',
        9: 'wxyz'
    }

    def __init__(self, num_string):
        self.num = [int(i) for i in num_string]                 # => [3, 4]
        self.chars = [PhoneWords.letters[i] for i in self.num]  # -> ['def', 'ghi']

    def __iter__(self):
        return (''.join(letters) for letters in itertools.product(*self.chars))

并在使用中:

for word in PhoneWords("34"):
    print word

返回

dg
dh
di
eg
eh
ei
fg
fh
fi
于 2012-06-08T16:22:00.443 回答
0

我想这是你想要的:

>>>from itertools import product
>>>def permuteString(numString):
>>>    original = {2:'abc',3:'def',4:'gfi',5:'jkl',6:'mno',7:'pqrs',8:'tuv',9:'wxyz'}
>>>    #extract the wanted string, for example input numString='23', the pools is ['abc', 'def']
>>>    pools = [original[int(n)] for n in numString]                                                 
>>>    return (''.join(x) for x in product(*pools)) #return a generator   

并以此方式使用

>>>for x in permuteString('23'):
>>>    print x
ad
ae
af
bd
be
bf
cd
ce
cf

细节:

product :输入迭代的笛卡尔积

生成器用于创建迭代器的简单而强大的工具

join : 是可以加入列表的,例如:

x = ['a', 'b', 'c', 'd']
print ''.join(x)

这将输出:

'abcd'
于 2012-06-08T02:23:02.500 回答