当前位置: 首页 > 面试题库 >

如何将列表中的每个项目与其余项目进行一次比较?

宋安晏
2023-03-14
问题内容

假设我有一个数组/要比较的事物列表。在我更熟悉的语言中,我会做类似的事情

for (int i = 0, i < mylist.size(); i++)
    for (int j = i + 1, j < mylist.size(); j++)
        compare(mylist[i], mylist[j])

这样可以确保我们只比较每对一次。在某些情况下,我正在对列表中包含的一堆对象进行碰撞检测。对于检测到的每个碰撞,将一个描述碰撞的小的“碰撞”对象添加到列表中,然后另一个例程循环循环以解决每个碰撞(取决于两个碰撞对象的性质)。显然,我只想报告每个碰撞一次。

现在,这样做的pythonic方式是什么,因为Python倾向于使用迭代器而不是遍历索引?

我有以下(越野车)代码:

for this in mylist:
    for that in mylist:
        compare(this, that)

但这显然会使每次碰撞发生两次,从而在尝试解决它们时导致一些奇怪的行为。那么这里的pythonic解决方案是什么?


问题答案:

当然,这将生成每对两次,因为每个for循环将遍历列表的每个项目。

您可以在这里使用一些itertools魔术来生成所有可能的组合:

import itertools
for a, b in itertools.combinations(mylist, 2):
    compare(a, b)

itertools.combinations
会在迭代中将每个元素与另一个元素配对,但只能配对一次。

您仍然可以使用基于索引的项目访问(与您以前使用的嵌套for循环相同)来编写此代码:

for i in range(len(mylist)):
    for j in range(i + 1, len(mylist)):
        compare(mylist[i], mylist[j])

当然,这看起来可能不那么好用,但是有时它仍然是最简单,最易理解的解决方案,因此您不应回避解决此类问题。



 类似资料:
  • 问题内容: 我遇到了我认为应该是一个非常简单的问题。 我需要将arrayList中的每个项目与列表中的其他所有项目进行比较,而无需将项目与其自身进行比较。它不像调用equals()比较那样简单,它涉及一些自定义逻辑,我在下面的代码中省略了这些自定义逻辑。而且,ArrayList不应以任何方式更改。 我似乎遇到的问题是,一旦进入第二个循环,我就不知道是否有另一个对象要与之比较(因为它是一个可变大小的

  • 我有一个div元素列表,每个元素都包含一个标题和一个正文部分。最初仅显示每个项目的标题,单击时,相应的正文应显示在标题下方。再次单击标题时,主体应消失。我使用的逻辑是在每个列表项上附加/删除类名“extended”,以便通过CSS显示和隐藏正文部分。 现在,我正在尝试创建一个动态脚本,以允许几乎无限的列表条目,而不必专门针对每个条目,但我无法使它适用于所有条目。 HTML JavaScript 上

  • 我有一个方法返回一个

  • 问题内容: 在Gradle多项目设置中是否无法在主项目文件夹之外使用外部依赖项? 就像文件中一样 还是必须 始终 将相关项目包含在父项目文件夹中? 问题答案: 假设以下文件系统层次结构: 将以下内容添加到您的中: 和你内心里面的 根据需要重复尽可能多的项目。

  • 你好,伙计们,我想使我的列表视图这样,一个项目滚动一次和平滑。这里是我尝试到目前为止,但没有运气:(请帮助和感谢提前 自定义ListView类 }

  • 问题内容: | uId | title | amount | makers | widgets | 1 richard 998 xcorp sprocket 2 swiss 995 ycorp framitz 3 ricky 90 zcorp flobber 4 ricky2 798 xcorp framitz 1 lilrick 390 xcorp sprocket 1 brie 200 mco