2011-05-26 11 views
8

में एक सूची के सबसेट की राशि का पता लगाएं यह शायद बहुत सरल है और मैं कुछ अनदेखी कर रहा हूँ ...अजगर

मैं पूर्णांकों की एक लंबी सूची है, इस मामले एक वेबसाइट के लिए दैनिक आगंतुकों का प्रतिनिधित्व करने में। मुझे साप्ताहिक आगंतुकों की एक नई सूची चाहिए। तो मुझे मूल सूची से सात समूहों को प्राप्त करने की आवश्यकता है, उन्हें योग करें, और उन्हें एक नई सूची में जोड़ें।

मेरे समाधान सुंदर जानवर बल लगता है, असजीला:

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

वहाँ ऐसा करने का एक अधिक कुशल, या अधिक pythonic तरीका है?

+1

यह वास्तव में एक अच्छा है codereview.stackexchange.com के लिए सवाल, जो एसपी है स्पष्ट रूप से कोड को बेहतर बनाने के लिए जो इसे तेजी से/अधिक सुरुचिपूर्ण बनाने के लिए काम करता है। –

+0

धन्यवाद ... उस stackexchange साइट के बारे में पता नहीं था। यह जानना मुश्किल है कि कौन सा प्रश्न किस प्रश्न के लिए उचित है, खासकर जब से इन दिनों बहुत सारे हैं। इसके अलावा, इस तरह की सभी आंखों की प्रतीत होती है, इसलिए मुझे हमेशा लगता है कि मूल सबसे अच्छा है। :) – fitzgeraldsteele

+0

इस कोड के साथ कुछ भी गलत नहीं है - यह सीधा है और इसके इरादे को अच्छी तरह से संवाद करता है। मैं 'x' और 'y' की तुलना में var नामों को और अधिक वर्णनात्मक में बदल दूंगा, लेकिन अन्यथा यह किसी भी समझ-आधारित हैक –

उत्तर

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

या थोड़ा कम घनी:

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

वैकल्पिक रूप से, numpy मॉड्यूल का उपयोग कर।

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

ध्यान दें कि विज़िटर में तत्वों की संख्या 7 के एकाधिक होने की आवश्यकता है। यह भी आवश्यक है कि आप numpy इंस्टॉल करें। हालांकि, यह शायद अन्य दृष्टिकोणों के साथ भी अधिक कुशल है।

या itertools कोड बोनस के लिए:

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' को दूसरे श्रेणी के साथ' रेंज() 'में बदलने के लिए +1। – John

+0

+1 itertools.izip_longest केस सहित, जिसे मैंने आशा की थी कि आपने ऐसा नहीं किया था, इसलिए मैं इसका उल्लेख कर सकता था। :-) –

+0

इसके अलावा, आगंतुकों के बड़े सेट के लिए या यदि आगंतुक जनरेटर हैं, तो itertools.izip_longest और itertools.imap विकल्प अधिक कुशल हैं, और मैं पहले 'श्रेणी' कॉल के बजाय 'xrange' का उपयोग करूंगा उदाहरण। –

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] 

मैं अगर यह "pythonic" है यकीन है कि नहीं हूँ, लेकिन मैं सच में अजगर का यह एक-पंक्ति सामान प्यार करता हूँ।

Gory विवरण: Comprehensions

0

itertools.islice का उपयोग करना:

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

संपादित करें:

या, math.fsum साथ:

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

इस तरह इस्लिस का उपयोग करना बहुत ही कुशल नहीं होगा। आप रोज़ाना बार-बार तत्वों पर फिर से चलने जा रहे हैं। –