Python数组简单的问题

时间:2014-01-28 10:34:00

标签: python arrays list

我有以下两个数组:

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])

提前致谢

5 个答案:

答案 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