#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
кортежи и напечатать, является ли каждый из них действительным или недействительным.