2017-02-13 6 views
1

のは、我々はランダムint型リストのすべての値を以前の値の変更に設定しますか?

私はすべての要素がいずれか自体、または前の要素であるところの新しいリストを取得(または場所にこのリストを変更)したいのリストを持っているとしましょう*

(大きい方)2これを行うための

一つの方法は次のとおりです。

a = [-1, 0, 5, -2, 1] 

for i in range(1:len(a)): 
    a[i] = max(a[i], a[i-1] * 2) 

#result should be [-1, 0, 5, 10, 20] 

しかし、1行でこれを行うには、いくつかの創造的な方法はありますか?同じ結果を得るために、ラムダ、マップ、イテレータのようなものを賢明に使用していますか?

私はzipを使ってすべての値と以前の値のペアを作成しようとしましたが、1つの要素を変更するとすぐに、それらの値も変更されないため、残りのzipは無意味です。 python3で

+1

https://docs.python.org/3/library/itertools.html#itertools.accumulate – user2357112

答えて

2

:しかしPythonの2と

a = [-1, 0, 5, -2, 1] 
list(itertools.accumulate(a, lambda acc, x: max(2 * acc, x)) 
>>> [-1, 0, 5, 10, 20] 

はありません、このような簡単な運、:

def agg(acc, x): 
    return acc + [max(2 * acc[-1], x)] 
reduce(agg, a[1:], a[0:1]) 
>>> [-1, 0, 5, 10, 20] 

あなたが使用し、これはもう少し喜ばせるためにセンチネルながら約マックすることができます

def agg(acc, x): 
    return acc + [max(2 * acc[-1], x)] if acc else [x] 
reduce(agg, a, None) 
>>> [-1, 0, 5, 10, 20] 

このような「酷使された」についての良い点は、reduce()はですこれまでの完全な変換履歴は0です。

あなたが accumulate機能は、Python 3.2で itertoolsモジュールに追加使用したり、独自に書くことができ
1

try: 
    from itertools import accumulate # added in Py 3.2 
except ImportError: 
    def accumulate(iterable): 
     """Return running totals (simplified version).""" 
     total = next(iterable) 
     yield total 
     for value in iterable: 
      total += value 
      yield total 
0

独自の発電機の機能をロールバックするつもりなら、あなたがこれを行うことができます:

def twice_if_bigger(iterable): 
    preval = next(iterable) 
    yield preval 
    for value in iterable: 
     preval=max(2*preval,value) 
     yield preval 

a = [-1, 0, 5, -2, 1] 
print([i for i in twice_if_bigger(a.__iter__())]) 

>> [-1, 0, 5, 10, 20] 
関連する問題