【问题标题】:print all number divisible by 7 and contain 7 from 0 to 100打印所有能被 7 整除并包含 7 从 0 到 100 的数字
【发布时间】:2018-10-04 12:20:20
【问题描述】:

我正在尝试创建一个 for 循环,该循环将打印从 0 到 100 的所有可被 7 整除的数字以及包含 7 的数字,如下例所示: 7 14 17 21 27 28 等等

我尝试过这样做:

for i in range(101):
    if i%7==0 or i==range(7,98,10):
        print(i)

但它会打印:

7 14 21等

我该怎么办?

【问题讨论】:

  • 0 可以被 7 整除。输出是否应该包含 0?
  • 旁注:执行此操作的简单方法是使用set 操作,因此您甚至不会生成不匹配的值。在 3.5+ 上使用 additional unpacking generalizations 你可以这样做:for i in sorted({*range(0, 101, 7), *range(7, 101, 10), *range(70, 80)}): print(i)。在 3.5 之前,您可以稍微慢一点:for i in sorted(set().union(range(0, 101, 7), range(7, 101, 10), range(70, 80))): print(i) 未发布为答案,因为它更多的是与您的提示一起玩而不是解决您的实际问题(并且因为它不是很普遍)。跨度>

标签: python python-3.x for-loop


【解决方案1】:

正如在别处指出的那样,i == range(7,98,10) 没有真正意义,因为您无法将整数与范围对象进行比较。您实际上要做的是成员资格测试,在 python 中使用 in 关键字:i in range(7,98,10)

您将发现的下一个问题是您缺少包含数字 7 的一类数字。即 70-79 范围(尽管您会从其他规则中获得 70 和 77)。按照您当前的策略,您的最终答案可能如下所示:

for i in range(101):
    if i % 7 == 0 or i in range(7, 98, 10) or i in range(70, 80):
        print(i)

这是完全有效的。你也可以用数学方法来处理它,注意,7 个个位的数字除以 10 时的余数为 7(称为模运算符,%),而 7 个十位的数字将有一个商除以 10 时为 7(使用整数除法,//)。

for i in range(101):
    if i % 7 == 0 or i % 10 == 7 or i // 10 == 7:
        print(i)

最后,你可以做一个巧妙的技巧,因为你用同一个数字检查除法和模数;这两个结果将由内置的divmod() 函数同时给出。您只需要检查其中任何一个是否为 7。(请注意,如果您扩展超过 2 位数字,这将不起作用。)

for i in range(101):
    if i % 7 == 0 or 7 in divmod(i, 10):
        print(i)

(注意:我将for 循环的范围与您的示例代码相同。这将在输出中包括0,因为它可以被7 整除。如果您不想要0,只需将范围更改为range(1, 101)。)

【讨论】:

  • 不错的答案+1,我不知道 divmod() 函数。
  • 赞成:我正在向下滚动以查看是否有人建议了数学方法,希望有人会提到divmod,并且您达到了这两点,所以我不需要自己做. :-) 旁注:遗憾的是,由于内置查找和函数调用开销,除非 ihuge(如数百位),divmod 从未真正节省任何时间。但这很方便,而且我们通常不太关心速度。
【解决方案2】:

如果你不想做 '7' in number 并在数学上做到这一点,你可以这样做

n = 7
i = 0
j = 100

# largest_multiple_of_n_smaller_than_j = (j - j%n) # 100 - 100%7 --> 100 -2 --> 98
# 98//7 --> 14 
# therefore we can say 7 multiply i( where i goes from 0 --> 14) will be less than equal to 100

multiples_of_n = [n*i for i in range(0, ((j - j%n) // n) +1)] # 0 7 14 21 ....98

# 17 27 37..(dont pick 77 here)..97 and 71 72 73...77..79
contains_n = [i*10+n for i in range(1,10) if i != n] + [n*10+x  for x in range(1,10) if (n*10+x) % n !=0] 

'''
or use this 

contains_n = [x for x in range(10+n,j,10) if x != n*11] + [x for x in range(n*10+1,n*10+10) if x % n !=0] 
'''

mult_and_contain_n =  sorted(multiples_of_n + contains_n)
print(mult_and_contain_n)


输出

n = 7

[0, 7, 14, 17, 21, 27, 28, 35, 37, 42, 47, 49, 56, 57, 63, 67, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 84, 87, 91, 97, 98]


n = 5

[0, 5, 10, 15, 15, 20, 25, 25, 30, 35, 35, 40, 45, 45, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 65, 65, 70, 75, 75, 80, 85, 85, 90, 95, 95, 100]

【讨论】:

    【解决方案3】:

    实际上当你这样做时:

    i == range(7, 98, 10)
    

    您正在将整数与可迭代对象进行比较。所以这个条件总是计算为False


    您要做的是检查您的数字的字符串表示是否包含7。你可以这样做:

    '7' in str(i)
    

    因此,在全局范围内,您可以编写以下代码:

    for i in range(0, 101):
        if i % 7 == 0 or '7' in str(i):
            print i
    

    【讨论】:

    • 我会编辑掉“一个生成器(把它想象成一个列表)”。它在概念上和功能上都是错误的。
    • 我改变了迭代器(因为它是python 3)。更好?
    • @LéopoldHoudin:不。 Python 3 上的rangeiterable,但它不是iterator。更准确地说,它是一个不可变的序列。
    【解决方案4】:

    使用 list comprehension 并使用 not i % 7 以及检查 str(i) 内容以获取 7

    print([i for i in range(7, 101) if not i % 7 or '7' in str(i)])
    # [7, 14, 17, 21, 27, 28, 35, 37, 42, 47, 49, 56, 57, 63, 67, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 84, 87, 91, 97, 98]
    

    【讨论】:

      猜你喜欢
      • 2018-04-10
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多