【问题标题】:python list element wise conditional incrementpython list element wise 条件增量
【发布时间】:2011-05-11 18:56:32
【问题描述】:

我已经搜索了一段时间,基本上我试图通过另一个列表有条件地增加一个元素列表,元素方面......

我的代码如下,但有更好的方法吗?列表理解,地图??

我认为像 http://www.python.org/dev/peps/pep-0225/ 中的 ~+= 这样的元素操作符会非常好,但为什么要推迟呢?

for i in range(1,len(s)):
        if s[i]<s[0]:
            s[i]+=p[i]

根据你们的一些良好反馈,我已重新编码为以下内容

i=s<s[0]
s[i]+=p[i]

和 s,p 都是数组。

对于我的一个代码,p.s 仍然比 matlab 慢 5 倍。

【问题讨论】:

    标签: python list increment


    【解决方案1】:

    检查这个 SO 问题:

    基本上是这样的:

    [sum(a) for a in zip(*[s, p]) if a[0] < 0]
    

    例子:

    >>> [sum(a) for a in zip(*[[1, 2, 3], [10, 20, 30]]) if a[0] > 2]
    [33]
    

    为了澄清,下面是 zip 的作用:

    >>> zip(*[[1, 2, 3], [4, 5, 6]])
    [(1, 4), (2, 5), (3, 6)]
    

    它将两个(或更多)列表连接成一个元组列表。您可以测试每个元组的元素的条件。

    【讨论】:

    • 我知道 zip,但问题是生成新列表会浪费旧列表的内存。
    • 如果条件不成立,你会得到一个更小的列表并丢失元素的相对位置。
    • @jerry 你在这两点上都是正确的,我误读了你添加的那一行。鉴于此,我认为没有比您提出的更好的解决方案了。
    【解决方案2】:

    这是一个快速版本:

    # sample data
    s = [10, 5, 20]
    p = [2,2,2]
    
    # As a one-liner.  (You could factor out the lambda)
    s = map(lambda (si, pi): si + pi if si < s[0] else si, zip(s,p))
    
    # s is now [10, 7, 20]
    

    这假设len(s) &lt;= len(p)

    希望这会有所帮助。让我知道祝你好运。 :-)

    【讨论】:

    • @jerry 我回答你的问题了吗?
    • @jerry 纯 Python 永远不会像 Matlab 一样快。主要是因为动态 OO 类型。如果您需要速度,您将需要一个专为数组设计的 python 模块。看看:numpy.scipy.org
    • @jerry 如果我回答了您的问题,请标记为“已回答”并告诉我。谢谢你。 :-)
    【解决方案3】:
    s = [s[i]+p[i]*(s[i]<s[0]) for i in range(1,len(s))]
    

    【讨论】:

      【解决方案4】:

      如果您不想创建新数组,那么您的选择是:

      1. 您提出的建议(尽管您可能希望使用 xrange,具体取决于 python 版本)
      2. 对 s 和 p 使用 Numpy 数组。然后,如果 s 和 p 的长度相同,则可以执行 s[s&lt;s[0]] += p[s&lt;s[0]] 之类的操作。
      3. 使用 Cython 加快您提出的建议。

      【讨论】:

      • 嗨,justin,刚试过numpy,效果不错,代码可以写成i=s
      • @jerry,是的,你可以这样做(如果 s 很大,应该这样做)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多