微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在组合期间更新列表?

如何解决如何在组合期间更新列表?

我想比较一个列表的元素,在每个 for 循环结束时,组合使用新的更新列表继续。

from itertools import combinations

aListe = ['a','b','c','d']
for first,second in combinations(aListe,2):
    # do something
    aListe.remove(first)
ValueError: list.remove(x): x not in list

更具体的#do something示例。

假设我的列表包含 shapely 多边形,例如

aListe = [polygon1,polygon2,polygon3,polygon4]
for first,2):
    if area(first) > area(second):
        aListe.remove(first)

如果列表中第一个多边形的面积已经大于第二个,我不希望将它与其他多边形进行比较。我希望下一个 for 循环在没有第一个多边形的更新列表上开始。

解决方法

如您所见,您的代码失败了,因为 itertools.combinations 多次访问每个列表项并且它只能被删除一次(假设它只包含一次)。

但即使您添加了 if first in aList 之类的检查来规避此错误,您也可能会得到意想不到的结果,这通常是在迭代列表时从列表中删除项目的情况,请参阅 {{3} }.

在您的情况下,我不会将多边形从列表中实际删除,而是通过将其添加到“已删除”集中来将其标记为“已删除”,如果再次遇到已删除的多边形,则跳过迭代。>

(注意,为了将多边形添加到集合中,如果我正确理解 Removing from a list while iterating over it"[...] 使用几何 ID 作为键,因为匀称的几何本身是不可散列的。")

from itertools import combinations

removed = set()
aListe = [polygon1,polygon2,polygon3,polygon4]
for first,second in combinations(aListe,2):
    if id(first) in removed:
        continue
    if area(first) > area(second):
        removed.add(id(first))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?