2016-02-29 43 views
-1

我在其中生成列表,只有「1」和「0」:在蟒蛇共同元素結合列表

list_1 = [1,0,0,1,0,0] 
list_2 = [1,0,1,0,1,0] 

我試圖將它們結合起來,這樣,如果「1」出現在任一列表,它出現在新列表中,並替換任何'0'

new_list = [1,0,1,1,1,0] 

代碼是什麼?

+0

你有什麼已經嘗試過?請顯示您的代碼並解釋哪些不適合您。 – idjaw

+0

我想過使用for循環來查看這兩個列表中的項目。如果兩個列表都有'1',那麼附加'1'else'0',但我不確定循環代碼:對於ex:對於list_1中的項目和list_2中的項目:....但這會導致錯誤! –

回答

1
上的列表理解

使用按位或|和使用zip功能:

>>> [x | y for x,y in zip(list_1, list_2)] 
[1, 0, 1, 1, 1, 0] 

如果列表中不具有相同的長度,使用zip_longestitertools模塊:

>>> l1 = [1,1,1,0,0,1] 
>>> l2 = [1,0,1,1,1,0,0,0,1] 
>>> 
>>> [x | y for x,y in zip_longest(l1, l2, fillvalue=0)] 
[1, 1, 1, 1, 1, 1, 0, 0, 1] 

的另一種方式,是使用starmap以及記得在Python3,這產生了一臺發電機,所以你必須把它轉換爲list後,這種方式:

>>> from itertools import starmap 
>>> from operator import or_ #bitwise or for the function passed to starmap 
>>> list(starmap(or_, zip_longest(l1,l2, fillvalue=0))) 
[1, 1, 1, 1, 1, 1, 0, 0, 1] 
0

這裏是你如何可以創建你的第三個列表:

list_3 = [int(x or y) for x,y in zip(list_1, list_2)] 

我有一種感覺,有一種方法更好的方式來完成你想要的東西,不使用這些列表。您可以將您的列表視爲二進制數字:

num_1 = int("100100", 2) 
num_2 = int("101010", 2) 
num_3 = num_1 | num_2 # bitwise or 
print(bin(num_3)) # prints '0b101110' 
+0

第一個解決方案起作用。我不確定第二種解決方案如何接收序列,因爲我正在使用不同的例程來填充列表。 –

0

您正在尋找的是按位或運算。如果任何一個輸入位爲1,則兩位的OR將爲1;如果兩者都爲0,則兩位的OR將爲1.

有多種方法可以在列表中對python進行此操作,但最簡單的方法是for循環。假設列表的長度相同,這會工作:

new_list = [] 
    for i in range(len(list_1)): 
     new_list.append(list_1[i] | list_2[i]) # the '|' character means bitwise OR 
+0

最初,列表的長度是相同的,但最終他們不會。我認爲編碼時間最長(如果len(ls_1)> len(ls_2)...)就是解決方案。 –