Python:根据索引集从列表中选择子集

新手上路,请多包涵

我有几个具有相同数量条目的列表(每个列表指定一个对象属性):

 property_a = [545., 656., 5.4, 33.]
property_b = [ 1.2,  1.3, 2.3, 0.3]
...

并列出相同长度的标志

good_objects = [True, False, False, True]

(可以很容易地用等效的索引列表代替:

 good_indices = [0, 3]

生成新列表的最简单方法是什么 property_asel , property_bsel , … 仅包含 True 条目或索引指示的值?–

 property_asel = [545., 33.]
property_bsel = [ 1.2, 0.3]

原文由 fuenfundachtzig 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 334
2 个回答

你可以只使用 列表理解

 property_asel = [val for is_good, val in zip(good_objects, property_a) if is_good]

要么

property_asel = [property_a[i] for i in good_indices]

后者更快,因为 good_indices property_a 长度少,假设 good_indices -f 是预先生成的,而不是 -


编辑:第一个选项等同于 itertools.compress 自 Python 2.73.1 起可用。请参阅 @Gary Kerr 的回答。

 property_asel = list(itertools.compress(property_a, good_objects))

原文由 kennytm 发布,翻译遵循 CC BY-SA 4.0 许可协议

我看到 2 个选项。

  1. 使用麻木:
    property_a = numpy.array([545., 656., 5.4, 33.])
   property_b = numpy.array([ 1.2,  1.3, 2.3, 0.3])
   good_objects = [True, False, False, True]
   good_indices = [0, 3]
   property_asel = property_a[good_objects]
   property_bsel = property_b[good_indices]

  1. 使用列表理解并压缩它:
    property_a = [545., 656., 5.4, 33.]
   property_b = [ 1.2,  1.3, 2.3, 0.3]
   good_objects = [True, False, False, True]
   good_indices = [0, 3]
   property_asel = [x for x, y in zip(property_a, good_objects) if y]
   property_bsel = [property_b[i] for i in good_indices]

原文由 Wolph 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题