Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于第二个列表作为索引更新列表元素_Python_List - Fatal编程技术网

Python 基于第二个列表作为索引更新列表元素

Python 基于第二个列表作为索引更新列表元素,python,list,Python,List,我希望这不是一个太难的问题,来自Python初学者 我有一个主列表listA,我需要根据索引列表listB中的值将该列表中的项归零 例如,假设: listA = [10, 12, 3, 8, 9, 17, 3, 7, 2, 8] listB = [1, 4, 8, 9] 我想要的输出是 listC = [10, 0, 3, 8, 0, 17, 3, 7, 0, 0] 这个问题[1]看起来类似,但要求删除元素,而不是更改。我不确定是否需要类似的方法,但如果需要,我看不出如何应用它 [1] 您可

我希望这不是一个太难的问题,来自Python初学者

我有一个主列表listA,我需要根据索引列表listB中的值将该列表中的项归零

例如,假设:

listA = [10, 12, 3, 8, 9, 17, 3, 7, 2, 8]
listB = [1, 4, 8, 9]
我想要的输出是

listC = [10, 0, 3, 8, 0, 17, 3, 7, 0, 0]
这个问题[1]看起来类似,但要求删除元素,而不是更改。我不确定是否需要类似的方法,但如果需要,我看不出如何应用它

[1]

您可以使用,和:


作为一个列表:

listC = [value if index not in listB else 0 for index, value in enumerate(listA)]
通过为列表B使用
集合
,可以显著改进大型列表的:

setB = set(listB)
listC = [value if index not in setB else 0 for index, value in enumerate(listA)]

或者复制列表并对其进行修改,这将更快、更具可读性:

listC = listA[:]
for index in listB:
    listC[index] = 0

我不太确定前者是否更快:它对每个索引执行一个缓慢的列表成员资格测试,并执行一个
enumerate
调用。第二种方法是快速复制一个元素,然后根据需要将尽可能多的元素归零。有趣的是,人们很容易陷入这样一个陷阱:总是假设一个列表的理解力更好,感谢你的回答。在我的实际数据中,listA有一百万项,listB有1089项。使用%%timeit,第一次进近时间为27.5秒,第二次进近时间仅为13毫秒。这是对的吗?这似乎是一个巨大的区别。@MichaelMaggs:测试列表中的成员身份很慢,因为必须逐个扫描元素(如果没有找到元素,则在扫描整个列表之前您不知道)。如果您执行了
setB=set(listB)
,然后在setB中使用
而不是
而不是在listB中使用
,则速度应该会快得多。是的,这会产生很大的差异。它使列表理解时间从27.5秒下降到191毫秒。但是,对于处理大型列表,简单循环仍然在速度上获胜。非常感谢您的帮助。我很乐意接受这一点,因为它工作得很好,但由于我只能接受一个答复,我决定选择mhlester's,它还包括一种替代方法。
listC = listA[:]
for index in listB:
    listC[index] = 0