我有以下两个数组:
array1 = [0, 1, 1, 0]
array2 = ['foo', 'bar', 'hello', 'bye']
我想在array2
中将1
的值保存到数组array1
。
在上面的示例中,所需的结果应为result_array = ['bar', 'hello']
。
我尝试过类似的东西,但它没有用。
for i in array1:
if i = 1:
result_array.append(array2[i])
提前致谢
答案 0 :(得分:7)
您的代码存在的问题是您在=
条件下使用if
,请将其替换为==
。其次要获取索引以及需要使用enumerate
的项目,目前您正在追加array[i]
,因此您的代码最终会追加'bar'
两次。
>>> result_array = []
>>> for i, x in enumerate(array1):
if x == 1:
result_array.append(array2[i])
...
>>> result_array
['bar', 'hello']
另一种更好的方法是使用zip
和列表理解:
>>> [b for a, b in zip(array1, array2) if a==1]
['bar', 'hello']
最快的方法是使用itertools.compress
:
>>> from itertools import compress
>>> list(compress(array2, array1))
['bar', 'hello']
答案 1 :(得分:2)
您可以使用内置的zip
功能和list comprehensions:
print [y for x, y in zip(array1, array2) if x == 1]
或者,如果你进入numpy
:
>>> import numpy as np
>>> array1 = np.array([0, 1, 1, 0])
>>> array2 = np.array(['foo', 'bar', 'hello', 'bye'])
>>> # np.nonzero returns indices of array1 that are, well, non-zero
>>> array2[np.nonzero(array1)]
array(['bar', 'hello'],
dtype='|S5')
答案 2 :(得分:2)
如果您只对数组1中的1
感兴趣,那么您可以使用zip
同时迭代多个列表/数组,请参阅http://docs.python.org/2/library/functions.html#zip(注意zip只会迭代,直到较短列表的长度):
>>> array1 = [0, 1, 1, 0]
>>> array2 = ['foo', 'bar', 'hello', 'bye']
>>> [j for i,j in zip(array1, array2) if i == 1]
['bar', 'hello']
如果您希望使用array1作为defaultdict中的键的两个数组的索引,请参阅http://docs.python.org/2/library/collections.html#collections.defaultdict:
>>> from collections import defaultdict
>>> array1 = [0, 1, 1, 0]
>>> array2 = ['foo', 'bar', 'hello', 'bye']
>>> array3 = defaultdict(list)
>>> for i,j in zip(array1,array2):
... array3[i].append(j)
...
>>> array3[1]
['bar', 'hello']
>>> array3[0]
['foo', 'bye']
答案 3 :(得分:1)
您的代码的修改版本将起作用:
for i in range(len(array1)):
if array1[i]:
result_array.append(array2[i])
您的代码中的问题是:
1)使用for i in array1
,其中i是创建的temp迭代器,用于表示列表中的值。因此它将始终为0或1,具体取决于它所代表的列表的值
2)if i=1
错了。 =
是赋值运算符,==
应该用于比较值。既然你说这个列表只包含0和1,if i:
就足够了
答案 4 :(得分:1)
from itertools import izip
res = [v2 for v1, v2 in izip(array1, array2) if v1==1]
对于小型列表,您可以使用简单的 zip 而不是 izip 。