比较列表元素与捕获:相互比较必须首先发生......元素顺序也很重要
Compare list elements with a catch: reciprocal comparisons must occur FIRST...also element order matters
我正在 Jython/Python 中编写用于图像分析的脚本(使用 ImageJ)。我的目标是将图像相互比较...
(为清楚起见编辑: 列表中的每个元素都必须与其他所有元素进行比较,但不允许自我比较。)
...但我有一些具体要求。这些要求是基于我使用预定义插件的事实。
例如:
imagefiles = ["A", "B", "C"]
首先:订单很重要。 "A"
vs "B"
不同于 "B"
vs. "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"
我能够生成一个代码来完成除了 第四 要求之外的所有事情......首先是相互比较。但我真的坚持如何按照我想要的方式进行比较。这是当前的工作片段,不满足我的4th要求。
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: index out of range: 3
我了解错误和问题...我只是不知道如何解决。我对编码还是很陌生,所以我可能遗漏了一个明显的 python 函数!
感谢任何输入
试试这个:
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)
我正在 Jython/Python 中编写用于图像分析的脚本(使用 ImageJ)。我的目标是将图像相互比较...
(为清楚起见编辑: 列表中的每个元素都必须与其他所有元素进行比较,但不允许自我比较。)
...但我有一些具体要求。这些要求是基于我使用预定义插件的事实。
例如:
imagefiles = ["A", "B", "C"]
首先:订单很重要。 "A"
vs "B"
不同于 "B"
vs. "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"
我能够生成一个代码来完成除了 第四 要求之外的所有事情......首先是相互比较。但我真的坚持如何按照我想要的方式进行比较。这是当前的工作片段,不满足我的4th要求。
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: index out of range: 3
我了解错误和问题...我只是不知道如何解决。我对编码还是很陌生,所以我可能遗漏了一个明显的 python 函数!
感谢任何输入
试试这个:
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)