【问题标题】:How can I summarize array's item greater, than 0, lower than 10如何总结数组的项目大于 0 小于 10
【发布时间】:2016-03-27 11:33:04
【问题描述】:

我是 Python 新手,我正在尝试运行一个简单的代码来汇总数组项,大于 0,小于 10。

你能不能,请看一下我的代码 - 无法得到,为什么它仍然汇总所有输入的数字:

import sys

print ("Hello word")
data = sys.stdin.readline()
tokens = data.split()

for i in range(len(tokens)):
    tokens[i] = int(tokens[i])

for token in tokens:
    if (token > 0 & token < 10):
        b = sum(tokens)
    else:
        print("err")



print (b)

【问题讨论】:

  • 你为什么使用stdin.readline()data 是什么?请创建一个MCVE
  • 您想在其中一个条件未满足或只是对过滤列表求和的情况下引发错误?
  • 有什么理由使用sys.stdin.readline()而不是内置的input??

标签: python python-3.x


【解决方案1】:

您应该使用and 而不是&amp;&amp;bitwise 并且:

x & y

执行“按位与”。如果x与y的对应位为1,则输出的每一位为1,否则为0。

你应该做什么:

for token in tokens:
    if token > 0 and token < 10:
      ....

区别:

In [8]: token = 100

In [9]: token > 0 & token < 10
Out[9]: True

In [10]: token > 0 and token < 10
Out[10]: False

 # would work but don't do it
In [11]: (token > 0)  & (token < 10)
Out[1]: True

您还可以通过链式比较进一步简化它:

for token in tokens:
    if 0 < token < 10:

如果您想获取 0-10 范围内的所有内容的总和,则可以在映射到 int 后使用 sum 和 filter :

data = sys.stdin.readline()
tokens = data.split()

print (sum(token for token in map(int, tokens.split(",")) if 0 < token < 10))

【讨论】:

    【解决方案2】:

    你也可以同时summing, filter那些超出你想要的范围的整数:

    >>> tokens = ['1','2','3','5','10','11', '4', '6']
    >>> sum(filter(lambda x: 0 < x < 10, map(int, (x for x in tokens))))
    21
    

    就像之前的答案中提到的那样,您使用的是按位和&amp; 而不是逻辑and

    另一种更好的方法是使用生成器表达式来避免使用 filter、'lambda' 和 map 中的任何一个:

    >>> sum(i for i in (int(x) for x in tokens) if 0 < i < 10)
    

    分析这两种方法,导致:

    >>> timeit.timeit('sum(filter(lambda x: 0<x<10, map(int, (x for x in tokens))))', "tokens = ['1','2','3','5','10','11', '4', '6']", number=10**5)
    0.2696745040011592
    >>> 
    >>> timeit.timeit('sum(i for i in(int(x) for x in tokens) if 0 < i < 10)', "tokens = ['1','2','3','5','10','11', '4', '6']", number=10**5)
    0.24827877001371235
    

    可以看出,在这种情况下,生成器表达式更快。

    【讨论】:

    • 稍微过度杀戮 - 你可以避免 filterlambdamap 并使用带有 sum 的 gen-exps 来实现它 - 这将在 2 中具有完全相同的行为。 x as 和 3.x - 例如:sum(i for i in (int(t) for t in tokens) if 0 &lt; i &lt; 10)
    【解决方案3】:

    每次一个标记大于 0 小于 10 时,您将 b 设置为所有标记的总和(与这些标记的值无关)。您应该:

    • 创建一个“过滤”列表并将其相加
    • 自己写“总和”

    第二种方法如下所示:

    b = 0
    for token in tokens:
        if (token > 0 & token < 10):
            b = b + token
        else:
            print("err")
    

    也就是说,您的代码不是很“pythonic”(这意味着它没有使用 python 为您提供的处理问题的功能)。 for 循环不仅可以向上计数一个整数变量(如 java for (int i=0; i&lt;10; i++) 循环),而且可以迭代任何可迭代对象(类似于 java 中的 for (Object : iterable) 循环)。请参阅official tutorial 了解更多信息。

    在这种情况下,稍后您可能希望使用 list comprehensions 而不是 for 循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2018-06-19
      • 2015-01-31
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多