【问题标题】:zip based on true/false tuple in python基于python中真/假元组的zip
【发布时间】:2013-10-31 23:35:39
【问题描述】:

我想要一个由ziped 列表组成的变量,但只有那些被选中的。也就是说,

selected = (True, True, False)
mylist1 = [1,2,4]
mylist2 = [4,5,8]
mylist3 = [3,2,7]

所以,如果selected 像上面那样,我想要得到mylist = zip(mylist1, mylist2)。也就是说,我只想zip 那些标记为True 的列表。目前我有一堆if-else,它看起来很丑。稍后我需要对三个以上的列表做同样的事情,我觉得必须有一个更通用的解决方案。有吗?

【问题讨论】:

  • 再次压缩并在理解范围内过滤
  • 如果你不介意使用 numpy,它是他们精美索引的经典用例

标签: python list python-2.7 tuples


【解决方案1】:

我喜欢代表你itertools.compress()

lists = [mylist1, mylist2, mylist3]
result = zip(*itertools.compress(lists, selected))

compress 创建一个迭代器,它从数据中过滤元素,仅返回那些在选择器中具有相应元素且计算结果为 True 的元素。当数据或选择器迭代已用尽时停止。

【讨论】:

    【解决方案2】:

    更多zip

    lists = [mylist1, mylist2, mylist3]
    selected_lists = (b for a, b in zip(selected, lists) if a)
    result = zip(*selected_lists) # itertools if necessary
    

    【讨论】:

      【解决方案3】:

      您可以使用numpy 的索引。

      import numpy as np
      selected = np.array([True, True, False])
      lists = np.array([mylist1, mylist2, mylist3], dtype = 'object')
      zip(*(lists[selected]))
      

      请注意,要使其正常工作,selected 必须是 numpy 数组,而不是元组。

      其实你可以选择跳过对zip的调用。 lists[selected] 已经是一个类似于您调用 zip 的结果的对象——它是可迭代的,并且每个元素都是具有 N 个元素的序列(其中 N 是 selectedTrues 的数量)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-18
        • 2020-10-27
        • 2017-06-05
        • 2011-07-04
        • 1970-01-01
        • 2019-04-21
        • 2014-10-18
        • 2021-11-01
        相关资源
        最近更新 更多