【问题标题】:python: make the elements of a list within a certain rangepython:使列表的元素在一定范围内
【发布时间】:2012-01-22 16:32:42
【问题描述】:

各位,

如果我有一个浮点数列表,并且我想通过添加或减去 2pi 使它们在 0 到 2pi 的范围内。有什么好的方法吗?

非常感谢。

【问题讨论】:

    标签: python list


    【解决方案1】:

    使用% 运算符:

    >>> pi = 3.1415
    
    >>> angle = 2*pi+0.5
    >>> angle % (2*pi)
    0.5
    
    >>> angle = -4*pi + 0.5
    >>> angle % (2*pi)
    0.5
    

    对于角度列表,只需使用列表推导:

    >>> L = [2*pi + 0.5, 4*pi + 0.6]
    >>> [i % (2*pi) for i in L]
    [0.5, 0.5999999999999996]
    >>> 
    

    【讨论】:

      【解决方案2】:

      你可以回答 mod 2 pi:

      >>> import random
      >>> from math import pi
      >>> xx = list(random.uniform(-10,10) for i in range(4))
      >>> xx
      [-3.652068894375777, -6.357128588604748, 9.896564215080154, -6.298659336390939]
      >>> yy = list(x % (2*pi) for x in xx)
      >>> yy
      [2.6311164128038094, 6.209242025754424, 3.613378907900568, 6.267711277968234]
      

      【讨论】:

      • 我自己对 python 很陌生,但是调用 list() 是否有理由而不是一开始就列出它们?即 xx = [random.uniform(-10, 10) for i in range(4)]
      • @ChadMiller 我认为list(...)[...] 在这种情况下也是如此。另一个想法是list(...) 创建一个临时的generator 表达式,然后调用list 构造函数。虽然列表理解(您的解决方案)可能会避免创建临时对象,但它可能会更有效。
      • @ChadMiller:两个原因。一个是历史性的:列表推导在 python 2.7 中泄漏变量,这在过去给我造成了问题,所以我学会了避免它。 (在上面的例子中,如果我使用 [random etc],那么我们最终会得到一个变量 i 分配给 3。)第二个是我很自然地从生成器表达式的角度思考——底层的 (random.uniform(-10 , 10) for i in range(4)) -- 我经常使用 next ,所以这也是习惯的力量。
      • @DSM 这对你来说可能是最有趣的。我阅读了 Guido Van Rossum(Python 的作者)的一篇文章,他在其中写道,他们使列表推导式可泄漏,以使其更高效,然后更快。他还写道,这就是列表推导式泄漏而生成器表达式没有泄漏的原因。他写道,从 Python 3 开始,列表推导不会泄漏。因此,对于 Python 2.x,使用列表解析可能更有效(在速度方面)(但在安全性方面风险更大(因为泄漏))。
      • @DSM 这里是文章的链接:python-history.blogspot.com/2010/06/… 引用:“这是列表推导的原始实现的产物;它是 Python 多年来的“肮脏小秘密”之一。它一开始是为了让列表理解速度极快而有意妥协,虽然这对初学者来说不是一个常见的陷阱,但它确实偶尔会刺痛人们。”
      【解决方案3】:

      考虑使用 math.fmod() ,因为它比 % 运算符更擅长处理浮点数的舍入。见讨论here

      【讨论】:

        猜你喜欢
        • 2016-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多