【问题标题】:python numpy.where function for lists用于列表的 python numpy.where 函数
【发布时间】:2013-08-12 13:46:31
【问题描述】:

我有一个带有两个列表的 python 程序,如下例所示:

list1=["a","b","c","d"]
list2=[0,1,1,0]

有没有一种优雅的方法来创建第三个列表,它在 list2 为 1 的位置包含 list1 的元素?我正在寻找类似于数组的 numpy.where 函数或更好的优雅方式:

array1=numpy.array(["a","b","c","d"])
array2=numpy.array([0,1,1,0])
array3=array1[array2==1]

是否可以创建一个与 array3 等效的 list3,在此示例中包含“b”和“c”,还是我必须强制转换或使用循环?

【问题讨论】:

  • 为什么不直接使用array3.tolist()

标签: python list numpy where


【解决方案1】:

您可以在这里使用列表推导式。

>>> array1 = ["a", "b", "c", "d"]
>>> array2 = [0, 1, 1, 0]
>>> [array1[index] for index, val in enumerate(array2) if val == 1] # Or if val
['b', 'c']

或者使用,

>>> [a for a, b in zip(array1, array2) if b]
['b', 'c']

【讨论】:

    【解决方案2】:

    这正是itertools.compress 所做的。

    >>> list1=["a","b","c","d"]
    >>> list2=[0,1,1,0]
    >>> import itertools
    >>> list(itertools.compress(list1, list2))
    ['b', 'c']
    

    【讨论】:

      【解决方案3】:

      您可以执行以下列表理解:

      [j for i,j in enumerate(list1) if list2[i]==1]
      

      你的例子给出了:

      ['b','c']
      

      构建get_val_where 函数:

      def get_val_where(list_val, list_where, val):
          return [j for i,j in enumerate(list_val) if list_where[i]==val]
      

      get_val_where(list1,list2,1)一样使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-25
        • 2022-01-12
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        相关资源
        最近更新 更多