我在其中生成列表,只有“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]
代码是什么?
我在其中生成列表,只有“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]
代码是什么?
使用按位或|
和使用zip
功能:
>>> [x | y for x,y in zip(list_1, list_2)]
[1, 0, 1, 1, 1, 0]
如果列表中不具有相同的长度,使用zip_longest
从itertools
模块:
>>> 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]
这里是你如何可以创建你的第三个列表:
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'
第一个解决方案起作用。我不确定第二种解决方案如何接收序列,因为我正在使用不同的例程来填充列表。 –
您正在寻找的是按位或运算。如果任何一个输入位为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
最初,列表的长度是相同的,但最终他们不会。我认为编码时间最长(如果len(ls_1)> len(ls_2)...)就是解决方案。 –
你有什么已经尝试过?请显示您的代码并解释哪些不适合您。 – idjaw
我想过使用for循环来查看这两个列表中的项目。如果两个列表都有'1',那么附加'1'else'0',但我不确定循环代码:对于ex:对于list_1中的项目和list_2中的项目:....但这会导致错误! –