2

the_map = { 1:'a',0:'b'}

现在要生成 和 的 8 个模式ab我们创建 8 个位模式:

>>> range(8)
[0, 1, 2, 3, 4, 5, 6, 7]
# 001,010,011....111

如何将位映射到字符 'a' 和 'b' ,以接收如下输出:

['aaa','aab','aba'.......'bbb']

我正在寻找一种高效的单班轮。我使用翻译或格式的方法对我来说似乎有点低效:

>>> import string
>>> [bin(x)[2:].zfill(3).translate(string.maketrans('01','ab')) for x in xrange(8)]
['aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bba', 'bbb']
4

4 回答 4

7

我想你正在寻找product

>>> from itertools import product
>>> [''.join(i) for i in product('ABC',repeat=3)]
['AAA', 'AAB', 'AAC', 'ABA', 'ABB', 'ABC', 'ACA', 'ACB', 'ACC', 'BAA', 'BAB', 'B
AC', 'BBA', 'BBB', 'BBC', 'BCA', 'BCB', 'BCC', 'CAA', 'CAB', 'CAC', 'CBA', 'CBB'
, 'CBC', 'CCA', 'CCB', 'CCC']
于 2013-06-12T07:28:26.090 回答
2

除了可读性之外没有很大的改进,但我认为新样式格式可能更适合这里:

>>> '{:0<3b}'.format(1).translate(string.maketrans('01', 'ab'))
'baa'
于 2013-06-12T07:32:30.010 回答
0

使用map. 当然不是性能改进,我猜:

>>> the_list = (0,1,16,255,32768)
>>> the_map = { '1':'a','0':'b'}
>>> list(''.join(map(the_map.get, (bit for bit in bin(num)[2:].zfill(3)))) for num in the_list)
['bbb', 'bba', 'abbbb', 'aaaaaaaa', 'abbbbbbbbbbbbbbb']

如您的示例所示,我填写 3 位数字。请注意,您将“1”映射到“a”,将“0”映射到“b”,而您的示例则相反。

于 2013-06-12T07:42:47.367 回答
0

因为这是创造力的问题;)我发布了另一个答案——完全不同的方法。

由于我们使用的是 8 位模式:

# Build our own translation table for all the 8-bit values (unsigned)
>>> import string
>>> ttable = string.maketrans('01','ab')
>>> the_map = {}
>>> for i in range(256):
...     the_map[i] = bin(i)[2:].zfill(3).translate(ttable)
... 

# Do the actual translation of an arbitrary list
>>> the_list = (0,1,16,255)
>>> map(the_map.get, the_list)
['aaa', 'aab', 'baaaa', 'bbbbbbbb']
于 2013-06-12T07:49:39.513 回答