将条件应用于python列表

时间:2014-06-10 14:27:11

标签: python list conditional-statements

我有一个包含两列的文本文件。我们称他们为r and xi,然后使用r,xi = numpy.loadtext

加载它们
 r         xi
2.5      2.510891
7.5     -0.436541
12.5     0.576983
17.5     0.377067
22.5     0.19648
27.5    -0.003876
32.5     0.117554
37.5     0.136895
42.5     0.261832
47.5    -0.08984

我知道如何删除xi 中的所有负值。我使用xi = [i for i in xi if i>0]给了我所有的正值。

我现在如何删除相应的r值?

在上面的示例中,第二行r和xi应该作为xi = -0.4删除,依此类推。

3 个答案:

答案 0 :(得分:5)

你可以使用与你现在拥有的非常相似的列表理解:

comp_list = [(r_i, xi_i) for r_i, xi_i in zip(r, xi) if xi_i > 0]

这将为您提供一个元组列表,然后您可以轻松地将其分开

<强>演示:

>>> r = [2.5, 7.5, 12.5, 17.5, 22.5, 27.5]
>>> xi = [2.51, -0.43, 0.57, 0.37, 0.19, -0.003]
>>> comp_list = [(r_i, xi_i) for r_i, xi_i in zip(r, xi) if xi_i > 0]
>>> comp_list
[(2.5, 2.51), (12.5, 0.57), (17.5, 0.37), (22.5, 0.19)]
>>> r, xi = zip(*comp_list)
>>> r
(2.5, 12.5, 17.5, 22.5)
>>> xi
(2.51, 0.57, 0.37, 0.19)

或者如果你是那些喜欢一次性完成这一切的人之一:

r, xi = zip(*[(r_i, xi_i) for r_i, xi_i in zip(r, xi) if xi_i > 0])

答案 1 :(得分:5)

[注意:甚至认为这个问题引用了python&#34;列出&#34;,因为用于读取对象的命令是numpy.loadtxt,我们实际上有numpy数组对象,所以让我们来看看&#39;利用这一点。]

您可以创建一个布尔数组并使用它来索引,而不是使用列表推导。您应该阅读"advanced indexing"上的教程部分。例如:

>>> r, xi = np.loadtxt("s.dat", skiprows=1, unpack=True)
>>> keep = xi > 0
>>> keep
array([ True, False,  True,  True,  True, False,  True,  True,  True, False], dtype=bool)

此数组在xi > 0处为True,而在keep处为False。我们现在可以使用>>> r[keep] array([ 2.5, 12.5, 17.5, 22.5, 32.5, 37.5, 42.5]) >>> xi[keep] array([ 2.510891, 0.576983, 0.377067, 0.19648 , 0.117554, 0.136895, 0.261832]) 来选择我们想要的内容:

{{1}}

答案 2 :(得分:0)

为什么你不想在将它们分成两个列表之前过滤行?

source_lines = numpy.loadtext(f)
filtered_lines = [x for x in source_lines if x[1] > 0]