Как работает это выражение для понимания вложенного списка? - PullRequest
0 голосов
/ 09 апреля 2019

У меня возникли проблемы с пониманием следующего понимания вложенного списка.Что делает первое «Истина» в этом выражении?Как работает общее выражение?


#Use a nested list comprehension to find all of the numbers from 1-1000 that 
#are divisible by any single digit besides 1 (2-9)
# comprehension testing truth for divisibilty: [True for divisor in range(2,10) if number % divisor == 0]
results = [number for number in range(1,1001) if True in [True for divisor in range(2,10) if number % divisor == 0]]
#print(results)

1 Ответ

1 голос
/ 09 апреля 2019

Начните с изучения внутреннего понимания:

[True for divisor in range(2,10) if number % divisor == 0]

В английском это говорит о том, что для всех divisor в range(2,10), если divisor равномерно делит number, то True будетбыть в списке.Другими словами, список будет состоять из числа True значений, равных количеству делителей от 2 до 9. Таким образом, если ничего от 2 до 9 не делит number, список будет пустым.Чтобы сделать это более понятным, абстрагируйте это в функции:

def hasSingleDigitDivisorList(number):
    return [True for divisor in range(2,10) if number % divisor == 0]

(Обратите внимание, что эта абстракция предназначена исключительно для понимания выражения. Учитывая, насколько громоздким является название, может не иметь смысла абстрагироватьэтот конкретный кусок кода в производстве.)

Затем замените функцию на понимание списка в исходном выражении:

results = [number for number in range(1,1001) if True in hasSingleDigitDivisorList(number)]

То, что список пуст, когда нет делителей,важный момент, так как проверка True in [...] не удастся тогда и только тогда, когда список пуст.Другими словами, выражение True in ... проверяет, есть ли делители от 2 до 9. Превратите это в функцию:

def hasSingleDigitDivisor(number):
    return True in hasSingleDigitDivisorList(number)

(hasSingleDigitDivisor имеет больше смысла как функциональная единица, чем hasSingleDigitDivisorList, так что вы можете использовать его в проекте.)

Затем подставьте эту новую функцию в общее выражение:

results = [number for number in range(1,1001) if hasSingleDigitDivisor(number)]

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

#... all of the numbers from 1-1000 that 
#are divisible by any single digit besides 1
...