Сравнение элементов списка с уловкой: взаимные сравнения должны произойти ПЕРВЫЙ ... также порядок элементов имеет значение - PullRequest
0 голосов
/ 28 апреля 2018

Я пишу скрипт на Jython / Python для анализа изображений (используя ImageJ). Моя цель - сравнить изображения друг с другом ...

( отредактируйте для ясности: Каждый элемент в списке должен сравниваться с любым другим элементом, но самостоятельное сравнение не допускается.)

... но у меня есть определенные требования. Эти требования основаны на том, что я использую предопределенный плагин.

Например:

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

Первое: порядок имеет значение. "A" против "B" отличается от "B" против "A".

Второе: список имеет переменный размер, основанный на вводе пользователем. В этом примере пользователь имеет 3 входных файла: A,B,C, но код должен учитывать случаи, когда количество элементов не равно трем.

В-третьих: само сравнение не допускается. То есть: "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 голосов
/ 28 апреля 2018

Попробуйте это:

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)
...