将列表元素与catch进行比较:必须首先进行倒数比较...元素顺序也很重要

时间:2018-04-27 23:47:37

标签: python loops iteration jython imagej

我正在用Jython / Python编写一个脚本进行图像分析(使用ImageJ)。我的目标是将图像与彼此进行比较...

编辑为清晰起见:列表中的每个元素都必须与其他所有元素进行比较,但不允许进行自我比较。)

......但我有一些具体的要求。这些要求基于我使用预定义插件的事实。

例如:

imagefiles = ["A", "B", "C"]

首先:订单很重要。 "A" vs "B""B""A"不同。

第二:根据用户输入,列表的大小可变。在此示例中,用户输入了3个文件:A,B,C,但代码需要容纳元素数量不等于3的实例。

第三:不允许自我比较。即:"A""A"不会发生。

第四:我希望在进入下一个元素之前对比较进行回报。例如:

"A" vs "B"然后"B" vs "A"而不是"A" vs "B"然后"A" vs "C"

第五:我最终需要以字符串的形式访问元素(由于将用户定义的变量调用到预先存在的插件中而需要)。

为清楚起见,必须进行的比较是:

"A" vs "B"
"B" vs "A"
"A" vs "C"
"C" vs "A"
"B" vs "C"
"C" vs "B"

我能够生成一个除 FOURTH 要求之外的所有内容的代码......首先是相互比较。但我真的坚持如何使比较的顺序成为我想要的。这是当前正在工作的剪辑,符合我的第4次要求。

from ij import IJ  #using Jython scripting in the ImageJ program

imagefiles = ["A", "B", "C"]

for index, imgs in enumerate(imagefiles):
    for s, secondimage in enumerate(imagefiles):
        if s != index:
            IJ.run("PluginFE", "element1="+imgs+" element2="+secondimage) #this calls the plugin (PluginFE) within the ImageJ program)

我试图考虑如何完成比较订单要求......并想出类似的结果:

for imgs in imagefiles:
    for index in range(len(imagefiles)):
      if index < len(imagefiles):
        IJ.run("PluginFE", "element1="+imgs+"element2="+imagefiles[index+1])

但失败并出现错误

  

IndexError:索引超出范围:3

我理解错误和问题...我只是无法弄清楚如何解决。我还很陌生,所以我可能会错过一个明显的python函数!

感谢任何输入

1 个答案:

答案 0 :(得分:1)

试试这个:

for index, imgs in enumerate(imagefiles[:-1]):
    for secondimage in imagefiles[index+1:]:
        IJ.run("PluginFE", "element1="+imgs+" element2="+secondimage)
        IJ.run("PluginFE", "element1="+secondimage+" element2="+imgs)

在外部循环中的一个元素之后从下一个元素开始内部循环确保每个对仅处理一次,imgs将始终是较早的一个。然后,它会使用两个订单中的图片调用IJ.run(),首先是imgs vs secondimage,然后是secondimage vs imgs

我认为您也可以使用itertools.combinations

import itertools
for imgs, secondimage in itertools.combinationa(imagefiles, 2):
    IJ.run("PluginFE", "element1="+imgs+" element2="+secondimage)
    IJ.run("PluginFE", "element1="+secondimage+" element2="+imgs)