【问题标题】:How does this nested list comprehension expression works?这个嵌套列表理解表达式是如何工作的?
【发布时间】:2019-08-30 03:28:29
【问题描述】:

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


#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)

【问题讨论】:

  • 请注意,True in [True for divisor in range(2,10) if number % divisor == 0] 会更自然地写成any(number % divisor == 0 for divisor in range(2,10))

标签: python list boolean


【解决方案1】:

从检查内在理解开始:

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

在英语中,这表示对于range(2,10) 中的所有divisor,如果divisor 均分number,则True 将在列表中。换句话说,该列表将由多个True 值组成,这些值等于从 2 到 9 的除数。因此,如果从 2 到 9 中没有任何内容可以除以 number,则该列表将为空。为了更清楚,在一个函数中抽象出来:

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

(请注意,此抽象仅用于理解表达式。鉴于名称非常笨拙,在生产中抽象这段特定代码可能没有意义。)

接下来,用 in 函数替换原始表达式中的列表推导:

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 的所有数字,如果它们有一个(非统一的)个位数除数,这与 sn-p 上方的注释匹配:

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

【讨论】:

  • if True in [True for divisor in range(2,10) if number % divisor == 0] 读起来更好if any(number % divisor == 0 for divisor in range(2,10))
猜你喜欢
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2011-03-20
相关资源
最近更新 更多