在条件下从列表中提取项目

时间:2013-11-12 16:27:41

标签: python list

我有两个值列表:

f=[1,1,1,2,2,2,3,3,3]
x=[10,20,30,40,50,60,70,80,90]

现在我想从x中提取所有项目,f中的相应项目符合条件

abs(i)=1

所以我想最终:

1 10
1 20
1 30

到目前为止,我的方法是:

for i in f:
    if abs(i)==1:
        for j in x:
            print i,j

但是这给了我f中每1个x的所有项目:

1 10
1 20
1 30
1 40
1 50
1 60
1 70
1 80
1 90
1 10
1 20
1 30
1 40
1 50
1 60
1 70
1 80
1 90
1 10
1 20
1 30
1 40
1 50
1 60
1 70
1 80
1 90

有没有人有想法,我必须做出进一步的条件?

5 个答案:

答案 0 :(得分:4)

使用zip

>>> [(a, b) for a, b in zip(f, x) if abs(a)==1]
[(1, 10), (1, 20), (1, 30)]

zip从传递给它的所有迭代中的相同索引返回项目。

>>> for a, b in zip(f, x):
...     if abs(a) == 1:
...         print a, b
...         
1 10
1 20
1 30

或者,如果您只想要x中的项目,那么itertools.compress会有所帮助:

>>> from itertools import compress
>>> list(compress(x, (abs(i)==1 for i in f)))
[10, 20, 30]

答案 1 :(得分:1)

使用zip

成对迭代
for i,x_ in zip(f,x):
  if abs(i) == 1:
    print i, x_

您可能还想考虑使用numpy花式索引:

>>> import numpy as np
>>> f = np.array(f)
>>> x = np.array(x)
>>> x[abs(f) == 1]
array([10, 20, 30])

答案 2 :(得分:0)

>>> x=[10,20,30,40,50,60,70,80,90]
>>> f=[1,1,1,2,2,2,3,3,3]
>>> 
>>> [ele for i, ele in enumerate(x) if abs(f[i]) == 1]
[10, 20, 30]
>>> 

答案 3 :(得分:0)

尝试使用:

 f=[1,1,1,2,2,2,3,3,3]
 x=[10,20,30,40,50,60,70,80,90]
 tot = zip(f, x)
 for z in tot:
  if abs(z[0])==1:
    print z[0], z[1]

它使用zip。它是一个有用的内置函数,允许您返回给定多个输入的元组列表。它有点像map(),但它的第一个参数是None

此外,重要的是要注意它们的输入必须具有相同的长度,否则将省略额外的索引。例如,如果输入是两个列表,长度为4,长度为10,则结果将是长度为4的元组列表和剩余的第二个输入的最后6个元素。

答案 4 :(得分:0)

这是因为你的循环在发现abs(i)== 1时打印整个第二个列表。我可能会做这样的事情:

for i in range(len(f)):
    try:
        if abs(f[i])==1:
            print f[i], x[i]
    except IndexError: #this means that x ended early
        break

这应该可以为您提供所需的输出。

相关问题