2014-01-28 125 views
0

我有整數e從0開始,我想有一個二進制列表bi個元素是1,如果且僅當i屬於的升序列表e二進制列表(Python)的

例如,如果e=[0,1,3,6],那麼這個二進制列表應爲[1,1,0,1,0,0,1], 其中第一1是因爲0是在e,第二1是因爲1是e,所述 第三0是因爲2不e等等。

你可以在下面找到我的代碼。

我的問題是:有沒有什麼內置的python的呢?如果不是,我的 方法最有效率?

def list2bin(e): 
b=[1] 
j=1 
for i in range(1, e[-1]+1): 
    if i==e[j]: 
     b.append(1) 
     j+=1 
    else: 
     b.append(0)  
return(b) 

回答

6

這可以用一個列表理解來完成,並且如果e是巨大的話,最好將其轉換爲一個set第一:

>>> e = [0, 1, 3, 6] 
>>> [int(i in e) for i in xrange(0, e[-1]+1)] 
[1, 1, 0, 1, 0, 0, 1] 

in操作返回True/False如果一個項目被發現在列表中,您可以使用int將該bool轉換爲整數。請注意,對於列表inO(N)的操作,所以如果e很大,那麼將其轉換爲一組將提供更多的效率。

+0

只是一個評論,Python3中不存在'xrange',除了解決方案很漂亮。 –

+0

@ Ashwini謝謝!不幸的是,我不得不使用列表。 'e'不會是那麼龐大(最多150個元素,雖然後面我可能會嘗試大約400個元素),但是這會被多次調用(我正在運行一個遞歸算法,幾周以及我問的每一次迭代)。在我看來,你認爲每次把列表變成一個集合是有意義的嗎? – geo909

+0

@ geo909'timeit' results:400列表中的搜索400需要12微秒,而一組只需要200納秒。 –

0

我不認爲有內置的方式來做到這一點。但您可以使用List Comprehensions

a = [ 1 if i in e else 0 for i in range(1, e[-1]+1) ] 

獲得樂趣。