piton

2011-05-26 20 views
8

bir listenin alt kümelerinin toplamı bul Bu muhtemelen çok basittir ve bir web sitesine günlük ziyaretçi temsil bu durumda, piton

Ben tamsayılar uzun bir liste var ... şey bakan ediyorum. haftalık ziyaretçisinin yeni bir listesini istiyorum. Bu yüzden, orijinal listeden yedi kişilik gruplar bulmalı, bunları toplamalı ve yeni bir listeye eklemeliyim.

numweeks = len(daily)/7 
weekly = [] 
for x in range(numweeks): 
    y = x*7 
    weekly.append(sum(visitors[y:y+7])) 

Bunu yapmanın daha verimli veya daha pythonic yolu var mı:

Benim çözümüm inelegant oldukça kaba kuvvet görünüyor?

+1

Bu aslında iyidir codereview.stackexchange.com için soru, hangi sp Daha hızlı/daha zarif hale getirmek için çalışan kod geliştirmek için özel olarak. –

+0

Teşekkürler ... bu stackexchange sitesini bilmiyordum. Hangi soru için uygun olduğunu bilmek zordur, özellikle de bu günlerde çok fazla olduğu için. Ayrıca, bu, tüm gözbebeklerine sahip gibi görünüyor, bu yüzden her zaman orijinalin en iyisi olduğunu hissediyorum. :) – fitzgeraldsteele

+0

Bu kodda yanlış bir şey yok - bu basit ve niyetini iyi iletiyor. Var isimleri sadece x' ve 'y' den daha açıklayıcı bir şeye dönüştürürdüm, fakat aksi halde bu anlama dayalı bir hack için tercih edilir. –

cevap

10
weekly = [ sum(visitors[x:x+7]) for x in range(0, len(daily), 7)] 

ya da biraz daha az yoğun:

weekly = [] 
for x in range(0, len(daily), 7): 
    weekly.append(sum(visitors[x:x+7])) 

Alternatif olarak, numpy modülü kullanılarak. Bu ziyaretçinin öğe sayısını gerektirdiğini

by_week = numpy.reshape(visitors, (7, -1)) 
weekly = numpy.sum(by_week, axis = 1) 

Not Ayrıca numpy yüklemenizi gerektirir 7. katları. Ancak, muhtemelen daha verimli, daha sonra diğer yaklaşımlar.

Ya itertools kod bonusu

: Bu "pythonic" ise

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return itertools.izip_longest(fillvalue=fillvalue, *args) 

weekly = map(sum, grouper(7, visitors, 0)) 
+0

+1, 'y = x * 7' yerine başka bir argüman ile' range() 'arasında değişir. – John

+0

+1 itertools.izip_longest da dahil olmak üzere +1'den bahsetmedim. :-) –

+0

Ayrıca, büyük ziyaretçi grupları için veya ziyaretçilerin bir jeneratör olması durumunda, itertools.izip_longest ve itertools.imap seçenekleri daha verimlidir ve ilk önce 'range' yerine bir' xrange' kullanıyorum örnek. –

0
>>> daily = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
>>> print [sum(daily[x:x+7]) for x in range(0, len(daily), 7)] 
[28, 77, 105] 

Emin değilim, ama gerçekten pitonun bu tek satırlık şeyleri seviyorum.

Kanlı Ayrıntılar: Comprehensions

0

itertools.islice kullanma:

Düzenleme
weekly = [sum(list(itertools.islice(daily, i, i+7))) 
      for i in range(0, len(daily), 7)] 

: math.fsum ile

ya,:

weekly = [math.fsum(itertools.islice(daily, i, i+7)) 
      for i in range(0, len(daily), 7)] 
+0

Bunun gibi islice kullanmak çok verimli olmayacak. Bu şekilde elementleri tekrar tekrar günlük olarak tekrar edeceksiniz. –