Я считаю, что линия вы смотрите на это:
sum([(abs(candidate-member) in multiset) for member in x])
Во-первых, слишком много скобку там. Давайте избавимся от вещей, которые нам не нужны:
sum(abs(candidate-member) in multiset for member in x)
Фу, это уже немного лучше. Теперь давайте реально смотреть на выражения поштучно:
abs(candidate - member) in multiset
Это само достаточно толковый ... Является ли абсолютное значение кандидата минус член в мультимножестве? Если да, выражение возвращает True
, если нет, выражение возвращает False
. Теперь что такое member
? Ну, есть одна для каждой вещи в iterable x
. Итак, вы суммируете кучу True
и False
. В python булевы подклассы от int
(с True == 1
и False == 0
), сумма в основном рассчитывает количество раз, о котором мы говорили ранее, - True
.
Затем они проверяют, если она равна len(x)
поэтому в основном, код проверки, если выражение True
для каждого члена в x
. К счастью, есть лучший способ, чтобы написать это в Python:
all(abs(candidate - member) in multiset for member in x)
Если это все еще сбивает с толку, мы могли бы переписать в виде функции (позволяет называть его f(x)
:
def f(x):
"""Equivalent to `all(abs(candidate - member) in multiset for member in x."""
for member in x:
if not abs(candidate - member) in multiset:
return False
return True
Для некоторого опорного чтения, в обоих случаях я использовал выражения генератора (которые аналогичны list-comprehensions в синтаксисе и значении, но они генерируют элементы «уступят» «на лету», а не материализуют весь список за один раз. Они более эффективны и быстрее для памяти некоторые операции. Они особенно полезны для случаев, когда вам не нужно смотреть на каждый предмет, чтобы знать результат (например, этот, где достаточно всего False
, чтобы сделать все выражение False
).
Похоже, что этот код использует расширенную функцию, называемую пониманием списка. Понятно, что человек, новый для Python, не поймет. – u8y7541
Вот что я подумал, он должен использовать некоторую расширенную функцию python. Не могли бы вы переписать простую форму? – Retr0spect
Код не детерминирован, так как результат зависит от порядка итерации по deltaSet. Это заставляет меня думать, что это неправильно, что бы это ни было. –