【问题标题】:Remove element from itertools.combinations while iterating?迭代时从 itertools.combinations 中删除元素?
【发布时间】:2016-08-31 03:25:11
【问题描述】:

给定一个列表l 和列表元素的所有组合,是否有可能在迭代所有组合时删除包含x 的任何组合,这样您就不会在迭代后考虑包含x 的组合删除了吗?

for a, b in itertools.combinations(l, 2):
    if some_function(a,b):
        remove_any_tup_with_a_or_b(a, b)

我的列表 l 非常大,所以我不想将这些组合保留在内存中。

【问题讨论】:

  • @PM2Ring:我认为关于“我不想将组合保留在内存中”的评论是说创建list(或其他一些数据结构)的简单解决方案这些组合,因此您可以在识别出它们后立即从list 中删除“坏”组合,这是不合适的。大多数甚至知道itertools 的人都知道生成器是如何工作的(避免了前期的内存成本)。
  • @ShadowRanger:哦,好的。

标签: python iterator combinations


【解决方案1】:

实现此目的的一个廉价技巧是使用动态更新的set 排除值通过不相交测试进行过滤,但它实际上不会避免生成您希望排除的组合,因此它不是主要的性能优势(虽然 filtering 使用像 isdisjoint 这样的 C 内置函数将比 Python 级别的 if 检查更快,通常通过将 filter 工作推送到 C 层来检查 continue 语句):

from future_builtins import filter  # Only on Py2, for generator based filter
import itertools

blacklist = set()
for a, b in filter(blacklist.isdisjoint, itertools.combinations(l, 2)):
    if some_function(a,b):
        blacklist.update((a, b))

【讨论】:

    【解决方案2】:

    如果您想从组合列表itertools.combinations(l, 2) 中删除所有包含数字x 的元组,请考虑从集合itertools.combinations([i for i in range(1,len(l)], 2) 到@ 的一对一映射(从数学上讲) 987654324@包含数字x

    示例:

    itertools.combinations([1,2,3,4], 2) 中不包含数字 1 的所有组合的集合由 [(2, 3), (2, 4), (3, 4)] 给出。请注意,此列表中的元素数等于列表itertools.combinations([1,2,3], 2)=[(1, 2), (1, 3), (2, 3)] 中组合的元素数。

    由于组合中的顺序无关紧要,您可以将[(1, 2), (1, 3), (2, 3)] 中的1 到4 映射为[(1, 2), (1, 3), (2, 3)]=[(4, 2), (4, 3), (2, 3)]=[(2, 4), (3, 4), (2, 3)]=[(2, 3), (2, 4), (3, 4)]

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 2012-05-13
      • 2011-02-21
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多