2010-11-18 63 views
3

我一直在寻找这一段时间,基本上我试图通过另一份清单,逐元素的有条件增加元素的列表...蟒蛇列表元素明智的条件增量

我的代码以下,但有更好的方法来做到这一点?列表理解,地图??

我觉得像〜+ = 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] 

和一些好反馈,p均为阵列。

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

回答

1

如果你不希望创建一个新的数组,那么你的选择是:

  1. 你提出什么(尽管你可能要取决于Python版本使用的xrange )
  2. 对s和p使用numpy数组。然后,如果s和p的长度相同,则可以执行类似s[s<s[0]] += p[s<s[0]]的操作。
  3. 使用Cython加快你的建议。
+0

嗨,贾斯汀,刚刚尝试numpy,效果很好,代码可以写成我= s 2010-11-19 21:56:22

+0

@jerry,是的,你可以做到这一点如果s非常大,应该如此)。 – 2010-11-19 22:04:24

1

入住这太问题:

基本上是这样的:

[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] 

要CLAR ify,这是zip的功能:

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

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

+0

我知道压缩包,但问题是生成一个新的列表浪费旧列表的内存。 – 2010-11-18 03:08:37

+0

也为条件不正确,你会得到一个较小的名单,失去元素的相对位置。 – 2010-11-18 03:11:40

+0

@jerry你在两点都是正确的,我误解了你添加的那一行。鉴于此,我认为没有比您提出的更好的解决方案。 – 2010-11-18 03:43:11

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) <= len(p)

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

+0

@jerry我回答你的问题吗? – nonot1 2010-11-22 04:36:45

+0

@jerry纯Python永远不会像Matlab那么快。主要是因为动态OO输入。如果你需要速度,你将需要一个专为数组设计的python模块。看看:http://numpy.scipy.org/ – nonot1 2010-11-22 04:38:58

+0

@jerry如果我回答你的问题,请标记为“已回答”并让我知道。谢谢。 :-) – nonot1 2010-11-23 03:19:45

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