2017-04-10 51 views
3

這裏是一個列表,例如[34, 52, 57]快速位串生成給定索引

該函數接受此列表並創建一個長度爲64的位串,其中每個索引除了在給定索引處都是0。

所以它看起來像[0,0,....1,...1,..1,..0,0,0]只在指數[34, 52, 57]我們有一個。

def bit_string_gen(a): 

    bit_string = [] 
    for key, value in enumerate(range(64)): 
     if key in a: 
      bit_string.append(1) 
     else: 
      bit_string.append(0) 

    return bit_string 

有沒有更好的方式來做到這一點,也許使用lambdamapitertools,而不是enumerate

回答

2

如果您在使用地圖尋找一個解決方案/λ ,這裏是一行:

map(lambda x: 1 if x in [34, 52, 57] else 0, range(0, 64))

3

與方法的問題是,你:

  • 使用if語句每一位;和
  • 使用in測試可能相當昂貴。

一個尤爲明顯方法可以是:

def bit_string_gen(a): 
    bit_string = [0]*64 
    for value in a: 
     bit_string[value] = 1 
    return bit_string 

所以在這裏你只迭代超過a的值,並設置這些位1

儘管如此,用列表編碼int s有點奇怪。更簡潔的方法是將此二進制編碼爲整數。例如通過使用:

def bit_string_gen(a): 
    bit_string = 0 
    for value in a: 
     bit_string |= 1 << value 
    return bit_string 

因此,在後一種情況下,如果你設置的位就像在你的樣品輸入,您將獲得:

>>> bin(bit_string_gen([34, 52, 57])) 
'0b1000010000000000000000010000000000000000000000000000000000' 
>>> hex(bit_string_gen([34, 52, 57])) 
'0x210000400000000'