【问题标题】:python: How to remove values from 2 lists based on what's in 1 listpython:如何根据 1 个列表中的内容从 2 个列表中删除值
【发布时间】:2026-01-23 15:00:01
【问题描述】:

我有 2 个号码列表,一个叫 xVar,另一个叫 yVar。我将使用这两个元素在图表上绘制 X 和 Y 值。它们都具有相同数量的元素。

一般情况下,我只会作图

ax.scatter(xVar,yVar,s=2,color='tomato');

我想从yVar 中删除超过某个值的数据,例如所有yVar 值超过100 的数据,但我也想删除关联的xVar 值。有人可以建议一种方法来创建 2 个新变量,以删除 yVar 中的所有值而不是 100 以及与它们关联的 xVar 值吗?然后我可以将绘图线中的xVaryVar 替换为新变量。

再次感谢大家,

【问题讨论】:

    标签: python


    【解决方案1】:

    每当您想对两个(或更多)列表的相应值做某事时,这就是zip 的用途。它为您提供了一个列表,其中包含每个索引的对应值。

    因此,在这种情况下,zip 将两个列表放在一起,然后过滤压缩列表,然后解压缩它们(再次使用 zip,如文档所述):

    xVar, yVar = zip(*((x, y) for x, y in zip(xVar, yVar) if y <= 100))
    

    如果这令人困惑,让我一步一步地展示它:

    >>> xVar = [1, 200, 300, 10]
    >>> yVar = [150, 100, 50, 200]
    >>> xyVar = zip(xVar, yVar)
    >>> xyVar
    [(1, 150), (200, 100), (300, 50), (10, 500)]
    >>> xyFiltered = [(x, y) for x, y in xyVar if y <= 100]
    >>> xyFiltered
    [(200, 100), (300, 50)]
    >>> xVar, yVar = zip(*xyFiltered)
    [(200, 300), (100, 50)]
    

    【讨论】:

      【解决方案2】:

      不写代码,找到要移除的y的索引,保存索引,移除y值,然后移除相同索引号处的x值。

      【讨论】:

      • 但是以这种方式删除多个元素时(例如,在列表迭代期间删除时)会有技巧/小问题..
      • @user2246674:只有一个技巧,真的:您必须在删除它们之前对索引进行反向排序。但是,是的,很容易忘记这样做,或者弄错。
      【解决方案3】:

      查找与您要保留的数据相对应的索引:

      ind = [i for i in range(len(yVar)) if yVar[i] < 100]
      

      并且只使用那些点:

      yVar = [yVar[i] for i in ind]
      xVar = [xVar[i] for i in ind]
      

      【讨论】: