此嵌套列表理解表达式如何工作?

时间:2019-04-08 22:24:47

标签: python list boolean

我在理解以下嵌套列表理解时遇到了一些麻烦。此表达式中的第一个“ True”是做什么的?整体表达如何工作?


#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 个答案:

答案 0 :(得分:1)

从检查内部理解开始:

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

用英语说,对于divisor中的所有range(2,10),如果divisor均分number,则True将在列表中。换句话说,该列表将包含等于{2到9的除数的数量的多个True值。因此,如果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