Как проверить равенство любых 2 из 3 переменных в чистом выражении?

avatar
Allen Underwood
8 апреля 2018 в 02:38
90
3
2

Я ищу более чистый способ сделать следующий тип сравнения:

if x ==  y or y == z or x == z:
    do something

Хотя в этом маленьком примере это было бы нормально, я хочу сравнить 24 переменные частями по 3 (как указано выше) за раз. Мне трудно найти более чистый способ сделать эти заявления. Есть идеи?

редактировать: чтобы это выглядело немного больше, чем то, что я пытаюсь очистить:

if(
   #corner 1 
   cube[0] == cube[29] or
   cube[0] == cube[42] or
   cube[29] == cube[42] or
   #corner 2
   cube[2] == cube[9] or
   cube[2] == cube[44] or
   cube[9] == cube[44] or
   #corner 3
   ...
   #corner 8
   ...
   ):
   doSomething

Решение благодаря Primusa:

corner1 = [cube[0], cube[29], cube[42]]
corner2 = [cube[2], cube[9], cube[44]]
...

if(len(corner1) != len(set(corner1)) or
   len(corner2) != len(set(corner2)) or
   ...)
    dostuff
Источник
Ry-
8 апреля 2018 в 02:41
1

Поместить это в функцию? Хотя, во-первых, странно иметь 24 переменные. Не могли бы вы вместо этого использовать список?

zwer
8 апреля 2018 в 02:42
1

Вам действительно нужны 24 переменные для начала?

Allen Underwood
8 апреля 2018 в 02:44
0

@Ry Все значения находятся в большем списке. Например, я пытаюсь сравнить myArray[0], myArray[3] и myArray[9], чтобы увидеть, равны ли любые 2 из этих 3 значений друг другу.

Ry-
8 апреля 2018 в 02:46
0

Какая-то логика, с которой сравниваются триплеты?

Allen Underwood
8 апреля 2018 в 02:46
0

@zwer Они действительно находятся в списке, а не во всех отдельных переменных. Это должно было просто упростить вопрос (по крайней мере, на мой взгляд).

Allen Underwood
8 апреля 2018 в 02:48
0

@Ry Да. Я сравниваю 3 цвета на углу кубика Рубика, чтобы убедиться, что нет двух одинаковых цветов. Часть моих ограничений заключается в том, что куб представлен в виде длинного списка из 54 элементов.

Allen Underwood
8 апреля 2018 в 02:59
0

@PrashinJeevaganth Это выглядит немного чище (хотя я надеюсь на что-то еще чище, если это возможно). Вопрос обновлен, чтобы более точно показать, что я просто пытаюсь сделать.

Prashin Jeevaganth
8 апреля 2018 в 03:03
0

@AllenUnderwood [ссылка] (coderhelper.com/questions/13792604/…), это может вам помочь

zwer
8 апреля 2018 в 03:03
0

Каково ваше определение «чистого»? Вы можете использовать any() и itertools.combinations(), чтобы избежать "ручного" сравнения, но я бы не назвал это чистым...

Ответы (3)

avatar
Primusa
8 апреля 2018 в 02:50
1

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

biglist = [LOTS OF STUFF]

if len(biglist) != len(set(biglist)):
    do stuff

set() — это структура данных Python, которая не может иметь дубликатов. В результате, если длина набора != длине списка, то в списке должны быть дубликаты, поэтому значения равны.

Если ваши значения не хэшируются, вы можете написать вспомогательную функцию, чтобы сделать код немного лучше:

def compare(x, y, z):
    return x==y or y==z or x==z
Ziyad Edher
8 апреля 2018 в 02:54
0

Я не думаю, что это отвечает на вопрос, они просят сравнить куски по три.

zwer
8 апреля 2018 в 02:54
1

Что произойдет, если x, y или z из вопроса OP являются изменяемыми/нехэшируемыми значениями?

Primusa
8 апреля 2018 в 02:55
0

@ZiyadEdher, вы можете использовать решение, чтобы сравнить его фрагментами любой длины. OP указал, что значения хранятся в списке в его комментариях, поэтому это решение будет работать нормально.

Allen Underwood
8 апреля 2018 в 03:02
0

@Primusa Это утверждение дает True против небольшого списка [1, 2, 3], когда я должен видеть False.

Primusa
8 апреля 2018 в 03:02
0

@AllenUnderwood, извините, я сделал опечатку, теперь она исправлена ​​:)

Allen Underwood
8 апреля 2018 в 03:08
0

Похоже, это сделало свое дело! Спасибо за это и за объяснение того, как это работает для этого конкретного примера!

Primusa
8 апреля 2018 в 03:08
0

@zwer, это очень хороший момент, я добавил вариант, если он не может быть хеширован

Primusa
8 апреля 2018 в 03:09
0

@AllenUnderwood Я рад помочь :)

avatar
Rahul Bharadwaj
8 апреля 2018 в 05:51
-1

Вы можете создать класс, чтобы сделать то же самое. Пример показан ниже

class TripleCompare(object):

    def __init__(self, inpList):
        self.allEle = inpList

    def compare(self):
        resList = []
        for a,b,c in self.allEle:
            resList.append(a==b or b==c or c==a)
        return resList
k=TripleCompare([[1,2,3],[4,5,6],[7,8,9]]) 
# send your elements like shown above, say TripleCompare([[c[0],c[29],c[49]],[c[21],c[22],c[23]]) (for example)
k.compare()
Allen Underwood
8 апреля 2018 в 06:10
1

Поскольку это предназначено только для тестовой функции, я сам избегаю использования класса. Но вы делаете хорошее замечание!

avatar
Aron
8 апреля 2018 в 03:17
-1

Это псевдокод... Как насчет этого:

class Corner:

    def __init__(self x, y, z):
        self.x = x;
        self.y = y;
        self.z = z;

    def hasMatch(self)
       return x==y || x==z || y==z;

Затем использовать:

c = Corner(10,11,10);
hasMatch = c.HasMatch();