2013-10-08 38 views
0

binary_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 

回答

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']}) 
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']} 
>>> 

所有這一切都應該除了可能是這個p,它非常簡單藝術:max(map(len, lst))。它所做的是計算lst中物品的最大長度。在這種情況下,最大長度爲3.如果我要向lst添加另一個具有4個字符(例如「1010」)的項目,最大長度將爲4.

您需要此來確定有多少個鍵放置在dct。你需要密鑰的數量永遠是項目的最大長度lst + 1

+0

正常'dict'有一個'setdefault'方法,可以在這裏使用,而不是用空列表初始化一個字典。 –

+0

@iCodez 這是簡單,但我不知道爲什麼我收到錯誤 '回溯(最近最後一次通話): 文件「」,1號線,在 文件「facebook_prob.py」第23行,in sortbit count_dict [element.count('1')]。append(element) AttributeError:'NoneType'對象沒有屬性'追加' ' – Liondancer

+0

我也不知道。也許你在其他地方定義了'element'。我給出的代碼經過測試和工作。 – iCodez

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']} 
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']}) 
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) 

希望這有助於!

+0

這將產生不正確的結果,因爲'dict.fromkeys'會爲每個鍵賦予與*值相同的列表*。例如:'a = dict.fromkeys([1,2],[]); a [1] .append('item')'給你'a'爲:'{1:['item'],2:['item']}' –

+0

@JonClements人們仍然贊同這個答案。 o_O –

+1

-1爲什麼這個答案是不正確的:[爲什麼listA.append('a')影響listB?](http://stackoverflow.com/questions/19165542/python-why-lista-appenda-affects-listb )正式注意到 –