2つの連続する数字をリストに追加する

リストに2つの連続番号を追加する方法。

l = [1,2,3,4,5,6,7,8,9]

result = [3,7,11,15,9]

l = [1,2,3,4,5,6,7,8,9,10]

result = [3,7,11,15,19]

単純なforループを使って簡単に達成できます。しかし どのように私はより多くのpythonic方法を使用してそれを達成することができます。

3
私は、この問題のために単純な for ループを使用することはPythonicとして得られると考えています。
追加された 著者 NPE,

6 答え

import itertools as it    
[sum(r) for r in it.izip_longest(l[::2], l[1::2], fillvalue=0)]

奇数と偶数の両方で待機している値を返します。

l = [1,2,3,4,5,6,7,8,9]    # [3, 7, 11, 15, 9]
l = [1,2,3,4,5,6,7,8,9,10] # [3, 7, 11, 15, 19]

UPDATE: if the original list is really large, you can replace the simple slices with islice:

[sum(r) for r in it.izip_longest(it.islice(l,0,None,2), it.islice(l,1,None,2), fillvalue=0)]

UPDATE 2: even a shorter and more universal version (without itertools) comes here:

l = [1,2,3,4,5,6,7,8,9,10]
n = 3

[sum(l[i:i+n]) for i in xrange(0, len(l), n)]
# returns: [6, 15, 24, 10]
13
追加された
@eyquem - update 2は普遍的な、あまり重い解決策ではありません。
追加された 著者 eumiro,
このソリューションは重いです
追加された 著者 eyquem,
最短のコード+1
追加された 著者 matiu,
今のステップは2です。その一般化はどうですか?それが2または3または4などかもしれないと言う
追加された 著者 user12345,

中間リストを避けるためにイテレータを使うことができます:

>>> it = iter([1,2,3,4,5,6,7,8,9,10])
>>> [i + next(it, 0) for i in it]
[3, 7, 11, 15, 19]

next StopIteration でゼロを返すので、 [1,2,3,4,5,6,7,8,9] コード>。

6
追加された
@eumiroはい、それが常にリストであれば。しかし、それは別のリストを作成するだろう
追加された 著者 JBernardo,
@glglglそれは本当に良いです。ありがとう
追加された 著者 JBernardo,
[i + next(it、0)for i] はどうでしょうか?
追加された 著者 glglgl,
it = iter(l + [0])で十分でしょうか?
追加された 著者 eumiro,
l が本当に大きいときに重要になるかもしれません。
追加された 著者 eumiro,

最善の方法!

今私の答えを変えたい。私はitertoolsソリューション以上のものが好きです。私はそれが最小のコードだと思う(あなたがitertoolsをインポートすると思います):

>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> if len(x) % 2: x.append(0)
... 
>>> map(sum, zip(x[::2], x[1::2]))
[3, 7, 11, 15, 9]

私はマップを気に入らない人もいることを知っていますが、私はそれが好きです:) どこかで読むは、リストの反復よりも高速です。


私の元の答え:

>>> x=[1,2,3,4,5,6,7,8,9,10]
>>> [a+b for a,b in zip(x[::2], x[1::2])]
[3, 7, 11, 15, 19]

しかし、奇数番号のリストには答えはありません:

>>> x=[1,2,3,4,5,6,7,8,9]
>>> [a+b for a,b in zip(x[::2], x[1::2])]
[3, 7, 11, 15]

kludge fix:

>>> x   
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> result = [a+b for a,b in zip(x[::2], x[1::2])]
>>> if len(x) % 2: result.append(x[-1])
... 
>>> print result
[3, 7, 11, 15, 9]

:)

3
追加された
今度は x = [1,2,3,4,5,6,7,8,9] でこれを行います。
追加された 著者 Tim Pietzcker,
x.append(0)は元のリストを変更します。これは問題の可能性があります。
追加された 著者 eumiro,

Pythonで効率的な方法は、 list を一度しか反復しないためです。

In [1]: l = [1,2,3,4,5,6,7,8,9]
In [2]: from itertools import izip_longest
In [3]: [sum (t) for t in izip_longest(* 2 * [iter(l)], fillvalue=0)]
Out[3]: [3, 7, 11, 15, 9]

参照: zip(* [iter(s)] * n)はどのようにPythonで動作しますか? と同じ奇妙な "2 iter "の説明と同じ list "構文について説明しています。


タイミング:

% python -m timeit -c 'l = [1,2,3,4,5,6,7,8,9]
from itertools import izip_longest
[sum (t) for t in izip_longest(* 2 * [iter(l)], fillvalue=0)]
'
100000 loops, best of 3: 9.42 usec per loop
1
追加された

リストを分割するために nsplit を書いてください( n items)。

>>> ls = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> nsplit = lambda s, n: [s[i:i+n] for i in range(0, len(s), n)]

# [1+2, 3+4, 5+6, 7+8, 9]
>>> [sum(x) for x in nsplit(ls, 2)]
[3, 7, 11, 15, 9]

# [1+2+3, 4+5+6, 7+8+9]
>>> [sum(x) for x in nsplit(ls, 3)]
[6, 15, 24]

# [1+2+3+4, 5+6+7+8, 9]
>>> [sum(x) for x in nsplit(ls, 4)]
[10, 26, 9]
0
追加された
from itertools import chain

l = [1,2,3,4,5,6,7,8,9]
it = chain(l,[0])
result = list(x + next(it) for x in it)
print l,'\n',result,'\n'


l = [1,2,3,4,5,6,7,8,9,10]
it = chain(l,[0])
result = list(x + next(it) for x in it)
print l,'\n',result,'\n'



l = [1,2,3,4,5,6,7,8,9]
it = chain(l,[0,0])
result = list(x + next(it) + next(it) for x in it)
print l,'\n',result,'\n'

l = [1,2,3,4,5,6,7,8,9,10]
it = chain(l,[0,0])
result = list(x + next(it)+ next(it) for x in it)
print l,'\n',result,'\n'

生産する

[1, 2, 3, 4, 5, 6, 7, 8, 9] 
[3, 7, 11, 15, 9] 

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[3, 7, 11, 15, 19] 

[1, 2, 3, 4, 5, 6, 7, 8, 9] 
[6, 15, 24] 

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[6, 15, 24, 10]

しかし、私はJBernardo - glglglのソリューションを好む

0
追加された