考虑:
a = [1, 1, 0, 1, 2]
b = [3, 2, 2, 0, 0]
我必须获取列表b中与列表a中的值1对应的所有项目。然后将所有出现在两个列表中的项目更改为0。
重要编辑:我还必须将这些项目作为输入。
我还必须同时对所有物品执行此操作。
我尝试过使用for循环来执行此操作,但是for循环会逐个而不是全部通过列表。
老实说,我对如何解决这个问题感到困惑。任何帮助表示赞赏! 谢谢! 注意:必须是python 3.X
超级编辑:(很抱歉,我之前没有这样做)
我希望代码像这样:
输入:
a = [1, 1, 0, 1, 2]
b = [3, 2, 2, 0, 0]
count = 0
输出:
a = [0, 0, 0, 0, 0]
b = [0, 0, 0, 0, 0]
count = 1
其中,计数应该随着数字的变化而增加。 因此,我必须仔细阅读列表,并对所有项目和列表同时执行上述步骤。 抱歉,我没有提早。
答案 0 :(得分:1)
如果您想做自己想做的事,并且正在寻找速度,这将起作用:
Boolean
这肯定可以,但是比上述方法慢。但这将有助于更好地理解。
[0 if x in b else x for x in a]
newa将是:
newa=[]
for i in a:
if i in b:
newa.append(0)
else:
newa.append(i)
答案 1 :(得分:1)
第一个解决方案,使用循环:
def with_loop(a, b):
out = []
for index, val in enumerate(a):
if val == 1:
out.append(b[index])
a[index] = 0
b[index] = 0
return out
a = [1, 1, 0, 1, 2]
b = [3, 2, 2, 0, 0]
print(with_loop(a, b))
# [3 2 0]
print(a)
# [0 0 0 0 2]
print(b)
# [0 0 2 0 0]
一些时间:
a = [1, 1, 0, 1, 2]
b = [3, 2, 2, 0, 0]
%timeit with_loop(a, b)
# 1000000 loops, best of 3: 806 ns per loop
a = [1, 1, 0, 1, 2]*20
b = [3, 2, 2, 0, 0]*20
%timeit with_loop(a, b)
#100000 loops, best of 3: 7.3 µs per loop
a = [1, 1, 0, 1, 2]*400
b = [3, 2, 2, 0, 0]*400
%timeit with_loop(a, b)
# 10000 loops, best of 3: 165 µs per loop
如果列表很大,最好使用numpy
:
import numpy as np
a = np.array([1, 1, 0, 1, 2])
b = np.array([3, 2, 2, 0, 0])
def with_numpy(a, b):
out = b[a == 1]
b[a == 1] = 0
a[a == 1] = 0
return out
print(with_numpy(a, b))
# [3 2 0]
print(a)
# [0 0 0 0 2]
print(b)
# [0 0 2 0 0]
再次,一些时间安排:
a = np.array([1, 1, 0, 1, 2])
b = np.array([3, 2, 2, 0, 0])
%timeit with_numpy(a, b)
#100000 loops, best of 3: 5.02 µs per loop
a = np.array([1, 1, 0, 1, 2]*20)
b = np.array([3, 2, 2, 0, 0]*20)
%timeit with_numpy(a, b)
#100000 loops, best of 3: 5.34 µs per loop
a = np.array([1, 1, 0, 1, 2]*400)
b = np.array([3, 2, 2, 0, 0]*400)
%timeit with_numpy(a, b)
#100000 loops, best of 3: 13.9 µs per loop
对于较小的列表,使用numpy
会产生较大的开销,但是它比纯Python循环解决方案(列表长度少于100个项目)要快,而对2000个项目来说,速度要快10倍以上。
答案 2 :(得分:0)
您可以使用一个生成器来检查两个序列并得出其当前值和将来值:
def gen(a,b):
for i in len(a):
if a[i]==1:
yield b[i] # need some cleverness about how we unpack this
yield (0,0)
else:
yield None
yield (a[i],b[i])
然后类似assign a,b = list(gen(a,b))
。我们将需要额外的代码来解压缩b的当前非零元素
答案 3 :(得分:0)
考虑到您也希望从ThreadPoolManager.getInstance().schedule() -> { };
中删除1
,请查看以下解决方案建议:
list
请记住,实际上确实需要遍历列表,除了逐个浏览列表之外,没有其他方法可以这样做。