2013-09-26 65 views
5

我有两个数字列表,一个名为xVar,另一个名为yVar。我将使用这2个元素在图上绘制X和Y值。他们都有相同数量的元素。python:如何从2列表中删除值,基于1列表中的内容

通常情况下,我只想绘制

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

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

再次感谢所有,

回答

11

每当你想做些什么来的两个对应的值(或更多)列表,这就是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)] 
+0

+1我正要写这个。 – arshajii

+0

完美,非常感谢。 – bigCow

1

无需编写代码,找到要删除,保存索引,删除Y值,然后以同样的指数中删除的x值在y索引。

+1

但删除多个元素时会有技巧/小鬼(例如,当去除列表的迭代过程中),这样.. – user2246674

+0

@ user2246674:只要一招,真正做到:你必须反向排序索引之前删除它们。但是,很容易忘记这么做,或者弄错了。 – abarnert

0

对应于数据查找索引要保留:

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] 
+2

您可能想查看[enumerate](http://docs.python.org/2/library/functions.html#enumerate) – iruvar

+0

@ 1_CR谢谢,是的,这是一个不错的选择。 – sashkello