我有两个值列表:
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
有没有人有想法,我必须做出进一步的条件?
答案 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
这应该可以为您提供所需的输出。