Идентификация элементов в кортеже

#python

#python

Вопрос:

Я хочу посмотреть, есть ли в кортеже из трех элементов два идентичных элемента и ноль. Вот пример:

 Hello = (1, 1, 0)
Hi = (1, 0, -1)
Greetings = (0, -1, 1)
 

Hello имеет два одинаковых числа (и числа, кроме 0, будут равны только -1 или 1), а два других — нет.

Если есть 0, а остальное занято n ( n может быть 1 или -1), то могу ли я создать функцию, которая «считывает» мой кортеж и видит, есть ли два элемента, равные друг другу, и один, равный 0?

Я начал кодировать, и это то, что я получил:

 tab = ((1,1,0),(1,0,-1),(0,-1,1))

def line(tab, l):
    if l == 1:
        return (tab[0][0],tab[0][1],tab[0][2])
    elif l == 2:
        return (tab[1][0],tab[1][1],tab[1][2])
    elif l == 3:
        return (tab[2][0],tab[2][1],tab[2][2])
    else:
        return ValueError('invalid')

def identify(n):
    if line(tab, 1)[0] == n and line(tab, 1)[1] == n and line(tab, 1)[2] == 0:
        print('2nd position')
    elif line(tab, 1)[0] == n and line(tab, 1)[1] == 0 and line(tab, 1)[2] == n:
        print('1st position')
    elif line(tab, 1)[0] == 0 and line(tab, 1)[1] == n and line(tab, 1)[2] == n:
        print('0º position')
    elif line(tab, 2)[0] == n and line(tab, 2)[1] == n and line(tab, 2)[2] == 0:
        print('2nd position')
    elif line(tab, 2)[0] == n and line(tab, 2)[1] == 0 and line(tab, 2)[2] == n:
        print('1st position')
    elif line(tab, 2)[0] == 0 and line(tab, 2)[1] == n and line(tab, 2)[2] == n:
        print('0º position')
    elif line(tab, 3)[0] == n and line(tab, 3)[1] == n and line(tab, 3)[2] == 0:
        print('2nd position')
    elif line(tab, 3)[0] == n and line(tab, 3)[1] == 0 and line(tab, 3)[2] == n:
        print('1st position')
    elif line(tab, 3)[0] == 0 and line(tab, 3)[1] == n and line(tab, 3)[2] == n:
        print('0º position')
    else:
        raise ValueError('invalid')
 

Как вы можете видеть, код огромен (но я думаю, что основы в порядке), но он не запускается. В чем может быть проблема?

Комментарии:

1. Тело вашей identify функции не имеет отступов…

2. Вы никогда не определяли n

Ответ №1:

для функции identify() требовался аргумент, а его не было. аргумент «n»

Ответ №2:

Я думаю, что это делает трюк:

 tab = ((1,1,0),(1,0,-1),(0,-1,1))
for tup in tab:
     a = 0
     b = 0
     c = 0
     for num in tup:

        if num == -1:
            a  = 1
        if num == 0:
            b  = 1
        if num == 1:
            c  = 1
    if (a == 2 and b == 1) or (c == 2 and b == 1):
        print('Task accomplished')
    else:
        print('Invalid')
 

вывод:

 Task accomplished
Invalid
Invalid
    
 

Комментарии:

1. Я не мог заставить это работать. После tab я создал функцию для остальных с аргументом tab (например, def yup (tab):), но в ней говорится, что она перестает работать в строке «если (a == 2 и b == 1) или (c == 2 и b == 1):»

2. Если вы создадите функцию, вам нужно иметь tup в качестве входных данных, как указано выше, а не tab. Когда я написал ‘tup для tab’ выше, он просматривает каждый кортеж в вашем списке кортежей и проверяет каждый из них. Другим вариантом было бы скопировать код точно так, как я его отправляю, и проверить, работает ли он

Ответ №3:

Я бы превратил кортеж в список, таким образом, было бы легче проверить наличие 0 в любом элементе. Если это так, добавьте все элементы и проверьте, равны ли они сумме 2 или -2. Есть много других способов проверить, равны ли два других 1 или -1, я думаю, что их суммирование достаточно элегантно, но имейте в виду, что это работает, только если они могут быть либо 1, либо -1, как вы написали.
Пример:

 def identify_tuple(my_tuple):
    my_list = list(my_tuple)
    if 0 in my_list:
        list_sum = sum(my_list)
        if list_sum == 2 or list_sum == -2:
            return True
    return False
 

Ответ №4:

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

 from typing import Tuple

def two_identical_and_a_zero(t: Tuple[int, int, int]) -> bool:
    non_zero = [e for e in t if e != 0]
    if len(non_zero) == 0:
        return True   # all zeroes
    if len(non_zero) != 2:
        return False  # odd number of zeroes
    return non_zero[0] == non_zero[1]

tab = [
    (1, 1, 0),
    (1, 0, -1),
    (0, -1, 1),
]

for t in tab:
    print(f"{t}: {'Valid' if two_identical_and_a_zero(t) else 'Invalid'}")
 

С принтами:

 (1, 1, 0): Valid
(1, 0, -1): Invalid
(0, -1, 1): Invalid
 

Комментарии:

1. Извините, но я не вижу, как я могу применить это к проблеме, которая у меня есть (все еще новичок в python). Представьте, что строка (tab, 1) — это мой кортеж с тремя элементами. Как я могу применить эту функцию?

2. two_identical_and_a_zero(line(tab, 1)) .

3. line Я думаю, что функция также не нужна; Я обновил свой ответ, чтобы просто просмотреть ваши tab кортежи и напечатать, является ли каждый из них действительным или недействительным.