1

Mybinary_list是“000”、“001”、“010”、....的字符串列表

我正在尝试将每个位串中 1 的数量添加到字典中。将创建字典,其大小n为字符串中出现的每个 1 的数量

我似乎无法将位串附加到列表中,然后将其添加到字典中。当我运行代码时,我得到:

input: sortbits(3)

000
001
010
011
100
101
110
111
{0: [], 1: [], 2: []}

正确的输出是:

000
001
010
011
100
101
110
111
{0: [000], 1: [001, 010, 100], 2: [011,101, 110], 3: [111]}

我的代码:

def sortbit(n):
    max_num = 2**n
    binary_list = []
    for x in range(0,max_num):
        stringy = []
        for a in range(n):
            stringy.append(str(x%2))
            x //= 2
        print ''.join(reversed(stringy))

        stringy_list = ''.join(reversed(stringy))
        binary_list.append(stringy_list)

    count_dict = dict.fromkeys(range(0,n+1))

    for element in binary_list:
        count = 0
        value_list = []
        for character in element:
            if character == '1':
                count += 1
        for y in count_dict:
            if y == str(count):
                value_list.append(element)
            count_dict[y] = value_list 

    print count_dict
4

5 回答 5

5
>>>strings=["000","001","010","011","100","101","110","111"]
>>>d={}
>>>for s in strings:
...     count = s.count("1")
...     if count not in d:
...             d[count]=[]
...     d[count].append(s)

>>>d
{0: ['000'], 1: ['001', '010', '100'], 2: ['011', '101', '110'], 3: ['111']}
于 2013-10-08T16:55:35.390 回答
3

collections.defaultdict在这里会更合适:

>>> from collections import defaultdict
>>> dic = defaultdict(list)
for i in xrange(8):
    bi = format(i, '03b')
    dic[bi.count('1')].append(bi)
...     
>>> dic
defaultdict(<type 'list'>, {
0: ['000'],
1: ['001', '010', '100'],
2: ['011', '101', '110'],
3: ['111']})
于 2013-10-08T16:59:15.937 回答
2

编辑:更正 dict.getkeys 了生成字典时的错误

创建字典时,您可以通过在同一行中创建附加到每个键的列表来节省时间。这应该可以解决您的问题:

count_dict = {x:[] for x in range(0,n+1)}

您也可以通过这种方式清理底部:

for element in binary_list:
    count_dict[element.count('1')].append(element)

希望这可以帮助!

于 2013-10-08T17:06:49.540 回答
2

这有效:

>>> lst = ['000', '001', '010', '011', '100', '101', '110', '111']
>>> dct = {x:[] for x in xrange(max(map(len, lst))+1)}
>>> for item in lst:
...     dct[item.count('1')].append(item)
...
>>> dct
{0: ['000'], 1: ['001', '010', '100'], 2: ['011', '101', '110'], 3: ['111']}
>>>

除了这部分之外,所有这些都应该非常简单:max(map(len, lst)). 这样做是计算 中项目的最大长度lst。在这种情况下,最大长度为 3。如果我要添加另一个lst具有 4 个字符的项目(例如“1010”),最大长度将为 4。

您需要它来确定要放置多少个键dct。您需要的键数将始终是lst+ 1 中项目的最大长度。

于 2013-10-08T16:55:20.003 回答
2
from collections import defaultdict
def sortbit(n):
    d = defaultdict(list)
    max_val = 2**n
    for x in range(0,max_val):
       d[bin(x).count("1")].append("{0:0{1}b}".format(x,n))
    return d

我认为至少,这将使您的二进制值自动变宽

>>> sortbit(3)
defaultdict(<type 'list'>, {0: ['000'], 1: ['001', '010', '100'], 2: ['011', '10
1', '110'], 3: ['111']})
>>> sortbit(4)
defaultdict(<type 'list'>, {0: ['0000'], 1: ['0001', '0010', '0100', '1000'], 2:
 ['0011', '0101', '0110', '1001', '1010', '1100'], 3: ['0111', '1011', '1101', '
1110'], 4: ['1111']})
于 2013-10-08T16:57:32.030 回答