2016-02-29 47 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)...)就是解决方案。 –