有条件地从两个列表中选择元素的巧妙方法?

FJD*_*JDU 4 python list

我有两个清单:

a = [-1, 2, 3]
b = ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

元素的数量ab总是相同的.

我希望保持所有元素a都是正面的,以及相应的元素b.

一种直截了当的方式

anew = []
bnew = []
for i in xrange(len(a)):
    if a[i] > 0:
         anew.append(a[i])
         bnew.append(b[i])
Run Code Online (Sandbox Code Playgroud)

或类似的东西

tmp = zip(*[(a[i], b[i]) for i in xrange(len(a)) if a[i]>0])
a = tmp[0] # The original a and b need not to be kept.
b = tmp[1]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更短更清洁(没有任何临时变量)的方法.某种就地删除是完美的,但如果我del a[i], b[i]在循环中使用,删除一个元素后索引将是错误的.

编辑:如果选择涉及两个列表,例如条件变为什么,该怎么办?

if a[i] > 0 and b[i] > 0

也许在这种情况下必须使用临时变量?

zha*_*hen 6

如果你使用numpy,有一个非常简洁的方式:

In [117]: a = np.array([-1, 2, 3])
     ...: b = np.array(['a', 'b', 'c'])

In [119]: a[a>0]
Out[119]: array([2, 3])

In [120]: b[a>0]
Out[120]: 
array(['b', 'c'], 
      dtype='|S1')
Run Code Online (Sandbox Code Playgroud)

如果没有numpy,您可以使用条件语句列表理解:

In [121]: a = [-1, 2, 3]
     ...: b = ['a', 'b', 'c']

In [122]: print [i for i in a if i>0]
[2, 3]

In [124]: print [v for i, v in enumerate(b) if a[i]>0]
['b', 'c']
Run Code Online (Sandbox Code Playgroud)


Mel*_*lug 3

我认为它可能是最短的:

filter(lambda x:x[0]>0, zip(a,b))
Run Code Online (Sandbox Code Playgroud)