如何使用排列生成字典的键

时间:2013-11-15 12:25:08

标签: python dictionary permutation

我需要创建一个字典,值可以留空或为零,但我需要键是ABCD字符与长度k的所有可能组合。例如,对于k = 8

lex = defaultdict(int)     
lex = {
'AAAAAAAA':0,
'AAAAAAAB':0,
'AAAAAABB':0,
...}

到目前为止,我已经尝试过这样的想法,我知道这是错的,但我不知道如何让它工作,我是python中的新手,所以请耐心等待我。

mydiction = {}
mylist = []
mylist = itertools.permutations('ACTG', 8)
for keys in mydiction:
    mydiction[keys] = mylist.next()
print(mydiction)

3 个答案:

答案 0 :(得分:4)

你可以在一行中完成,但你要找的是combinations_with_replacement

from itertools import combinations_with_replacement
mydict = {"".join(key):0 for key in combinations_with_replacement('ACTG', 8)}

答案 1 :(得分:2)

您所描述的不是排列,而是替换的组合。在itertools模块中也有一个函数。

但请注意,那里有六万种组合。试图将它们全部放入字典中,或者甚至只是迭代它们,都不会产生令人满意的结果。

你的用例是什么?您可能只需要识别组合,而不是彻底地生成组合。并且每个组合本质上与特定的16位整数索引相关联,因此您可以存储和操作它。

答案 2 :(得分:2)

尽管combination_with_replacement函数完全正常,但您将生成一个巨大的字符串列表,其碰撞率相对较高(约20%)

您要做的事情可以使用base4整数来完成。它们不仅处理速度更快,内存效率更高,而且它们也有0个冲突(每个数字都是它自己的哈希值),这意味着在最坏的情况下保证O(1)查找时间。

def num_to_hash(n, k, literals='ABCD'):
    return ''.join((literals[(n >> (k - x)*2 & 3)] for x in xrange(1, k+1)))

k = 2
d = {num_to_hash(x, k, 'ACTG'): 0 for x in xrange((4**k) - 1)}
print d 

输出:

{'AA': 0,
 'AC': 0,
 'AG': 0,
 'AT': 0,
 'CA': 0,
 'CC': 0,
 'CG': 0,
 'CT': 0,
 'GA': 0,
 'GC': 0,
 'GT': 0,
 'TA': 0,
 'TC': 0,
 'TG': 0,
 'TT': 0}