【问题标题】:Python replacing values using index and/or valuesPython 使用索引和/或值替换值
【发布时间】:2023-04-09 18:52:01
【问题描述】:

考虑:

a = [1, 1, 0, 1, 2]
b = [3, 2, 2, 0, 0]

我必须获取列表 b 中与列表 a 中值 1 对应的所有项目。然后将所有出现在 both 列表中的项目更改为 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

其中 count 应该随着数字的变化而增加。 因此,我必须浏览列表并为所有项目和列表同时执行上述步骤。 对不起,我没有早点提出这个。

【问题讨论】:

  • 你能写出预期的输出吗?
  • 如果我没记错的话,预期的输出应该是a = [1, 1, 0, 1, 0]b = [0, 0, 0, 0, 0]
  • @Grimlock 你认为实现目标的过程应该看起来相似吗?
  • @Thomas 我已经更新了解释
  • @hygull 我现在已经写出了输出

标签: python python-3.x list replace


【解决方案1】:

考虑到您也想从list a 中删除1s,请查看此解决方案建议:

>>> x, y = map(list, zip(*[(0 if i==1 else i, 0 if i==1 else j) for i, j in zip(a, b)]))
>>> print('x: {}, y: {}'.format(x, y))
x: [0, 0, 0, 0, 2], y: [0, 0, 2, 0, 0]

请记住,实际上需要遍历列表,并且除了逐个遍历列表之外没有其他方法。

【讨论】:

    【解决方案2】:

    第一个解决方案,使用循环:

    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 的开销很大,但它比使用列表长度少于 100 项的纯 Python 循环解决方案更快,并且对于 2000 项而言速度快 10 倍以上。

    【讨论】:

    • 这很全面,但您可能刚刚成功地压倒了一些试图完成作业的孩子。不是说有问题,而是呃...
    • 好的,所以我的列表永远不会太长,所以我将采用第一个解决方案。但是,如果列表 a 中有 1,列表 b 中有 0,我必须返回并翻转列表 b 中对应于列表 a 中的 0 的项目。
    【解决方案3】:

    如果你想做你所要求的并且正在寻找速度,这将起作用:

    [0 if x in b else x for x in a]
    

    我相信这会起作用,但比上述方法慢。但这将有助于更好地理解。

    newa=[]
    for i in a:
        if i in b:
            newa.append(0)
        else:
            newa.append(i)
    

    新的将是:

    [1, 1, 0, 1, 0]
    

    【讨论】:

    • 唯一的问题是 for 循环会一一遍历项目。我需要一种方法来同时完成所有这些
    • @Grimlock 为什么要同时发生?
    • @inder 你可以在没有列表理解的情况下写这个
    • @Grimlock 对不起,我认为我没有关注,没有列表理解的意义???
    • @Grimlock 我不认为你所要求的实际上是可行的......就像python中的列表理解是“要做的事情”......不知何故你需要遍历列表,因为没有这样的作为对此的“一次性解决方案”。
    【解决方案4】:

    您可以使用生成器来检查这两个序列并生成它们当前和未来的值:

    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])
    

    然后分配a,b = list(gen(a,b))。我们需要额外的代码来解压 b 的当前非零元素

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 2014-11-03
      • 2014-04-29
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2016-04-03
      相关资源
      最近更新 更多