#python #list #function #list-comprehension #any
#python #Список #функция #понимание списка #Любой
Вопрос:
Мне нужно написать функцию Python isReflexive и isSymmetric, которые являются эксклюзивными для понимания списка Python и функции all или any. Пример:
isSymmetric([2,3,4],[(2,3),(3,2),(3,3),(2,4),(4,2)])
True
isTransitive([[2,3,4,5],[(2,3),(3,2),(3,3),(3,4),(2,4),(4,2),(2,2),(4,4),(4,3)]
Верно
Аргумент 1 — это базовый набор (список), а аргумент 2 — это отношение к этому базовому набору.
Я пробовал это, но это не работает, потому что я также проверяю кортежи, которые мне не нужно проверять:
def isSymmetric(g,r):
return all([(x,y) = r for x in g for y in g])
Я не знаю, как решить проблему…
И isTransitiv я не знаю, как начать D:
Заранее спасибо за всю помощь!
Комментарии:
1. Вы сначала консультировались со своим учебником, учителем и т. Д.?
Ответ №1:
Следующие реализации на основе comp / gen будут работать для симметрии и транзитивности:
from itertools import product
def isSymmetric(g, r):
s = set(r)
return all(x[::-1] in s for x in s)
def isTransitive(g, r):
s = set(r)
return all(
((x,y) in s and (y,z) in s) <= ((x,z) in s)
for x, y, z in product(g, repeat=3)
)
Оба не идеальны с точки зрения алгоритмического POV. Лучше (меньше и быстрее проверок) было бы:
def isSymmetric(g, r):
s = set(r)
while s:
x, y = s.pop()
if x != y: # (x, x) does not need a partner
try:
s.remove((y, x))
except KeyError: # reverse not there!
return False
return True
Проверка транзитивности немного сложнее. Вы можете использовать вспомогательную структуру данных ( collections.defaultdict
), чтобы сделать все проверки постоянными, а не линейными:
def isTransitive(g, r):
d = defaultdict(set)
for x, y in r:
d[x].add(y)
for x in g: # `for x in d` reduces iterations in the general case
for y in d[x]: # all (x, y)
if not all(z in d[x] for z in d[y]): # exists (x, z) for (y, z)?
return False
return True
Комментарии:
1. Я знаю, что такое транзитивность и симмертия, но я хочу выполнять функцию только с пониманием списка и любым или всеми. Я уже пробовал это без каких-либо или всех и перечислений. Я знаю, как это работает, но я хочу знать, что это работает с пониманием списков…..
2. Зачем понимание, если у вас может быть генератор, который делает то же самое без использования памяти?
3. Это действительно должно быть
return all((x,x) in r for x in g)
4. Я знаю, что это работает с пониманием списков, но я не знаю, как его запрограммировать. Я уже запрограммировал reflexiv … и теперь я хочу запрограммировать transititv и symmetric
5. Первый — это то, что стремится к симметрии, не так ли?