2

我有两个值列表:

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

有谁知道,我必须做出哪些进一步的条件?

4

5 回答 5

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]
于 2013-11-12T16:31:55.453 回答
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])
于 2013-11-12T16:33:32.633 回答
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]
>>> 
于 2013-11-12T16:32:55.977 回答
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 个元素被省略。

于 2013-11-12T16:36:26.230 回答
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

这应该会给你你正在寻找的输出。

于 2013-11-12T16:36:41.773 回答