Python使用索引和/或值替换值

时间:2018-08-18 08:09:06

标签: python python-3.x list replace

考虑:

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

其中,计数应该随着数字的变化而增加。 因此,我必须仔细阅读列表,并对所有项目和列表同时执行上述步骤。 抱歉,我没有提早。

4 个答案:

答案 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

请记住,实际上确实需要遍历列表,除了逐个浏览列表之外,没有其他方法可以这样做。