【问题标题】:Itertools combinations copy and deleteitertools组合复制删除
【发布时间】:2021-04-01 18:26:35
【问题描述】:

假设我们有一个简单的列表,例如a = [obj_1, obj_2, obj_3, obj_4]。 其中obj_1 是基于from shapely.geometry import Polygon 的自定义对象 现在我们想要获取所有组合的列表。

from itertools import combinations
combs = combintations(a, 2)

到目前为止工作正常。在接下来的步骤中,我们要遍历所有组合并返回所有对象的列表,其中不包括属于combination 的对象。

for combination in combs:
    if combination is correct: # pseudo
        #return a list of all unique objects (obj_x), which doesn't contain combination

我试图在梳子中跟踪组合的位置,但得到了the TypeError: 'itertools.combinations' object is not subscriptable

我还在 itertools 文档中查找了删除功能,但没有发现任何有用的东西。

任何想法都值得赞赏。提前致谢

PS: 例如列表a = [obj_1, obj_2, obj_3, obj_4]如果combination = (obj_1, obj_3)是正确的,需要返回为[obj_2, obj_4]

【问题讨论】:

  • 使用combs = list(combinations(a, 2))将其转换为列表
  • 你想用下标做什么?
  • 很难从那个模糊的伪代码中看出你真正想要做什么。显示出现错误的代码。
  • combinations() 不返回列表,而是返回生成器。所以你不能从中删除,因为它会根据你的需要生成组合。这很有用,因为可能有数千或数百万种组合。
  • @Barmar 是的,但是你如何从“combination”中删除“combs”中至少包含两个对象之一的所有元组

标签: python combinations itertools


【解决方案1】:

迭代combs,如果元素组合正确,则从a 中删除它们。

correct_obj = []
for o1, o2 in combs:
    if (o1, o2) is correct:
        if o1 in a:
            a.remove(o1)
        if o2 in a:
            a.remove(o2)

这假设对象是可散列的,因此可以将它们放入一个集合中。如果没有,就让它成为一个普通的列表。

【讨论】:

  • 对不起,我打错了列表理解。
  • 您的解决方案几乎是完美的。我仍然对我的对象有困难。 TypeError: unhashable type: 'list' 同时添加对象。如果我将对象放在列表中。我的对象本身不是可散列的。看起来像这样 POLYGON ((1984 1824, 1984 2137, 1824 2137, 1824 1824, 1984 1824))
  • 是的,但是“它”是指对象,对吗? [POLYGON] 已经不是普通的列表了吗?
猜你喜欢
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多