2011-06-15 8 views
23

मुझे पूर्णांक की एक सूची मिली है और मैं डुप्लिकेट के संगत ब्लॉक की पहचान करने में सक्षम होना चाहता हूं: यानी, मैं डुप्लिक की ऑर्डर-संरक्षित सूची बनाना चाहता हूं जहां प्रत्येक डुप्लिकेट (int_in_question, घटनाओं की संख्या) शामिल है।सूची में लगातार डुप्लिकेट की पहचान करने के लिए सबसे महत्वपूर्ण तरीका क्या है?

उदाहरण के लिए, अगर मैं की तरह एक सूची है: मैं परिणाम होना चाहता हूँ

[0, 0, 0, 3, 3, 2, 5, 2, 6, 6] 

:

[(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)] 

मैं एक तक- और के साथ ऐसा करने का एक काफी आसान तरीका है लूप, एक अस्थायी, और एक काउंटर:

result_list = [] 
current = source_list[0] 
count = 0 
for value in source_list: 
    if value == current: 
     count += 1 
    else: 
     result_list.append((current, count)) 
     current = value 
     count = 1 
result_list.append((current, count)) 

लेकिन मुझे वास्तव में पाइथन की func पसंद है tional प्रोग्रामिंग idioms, और मैं एक साधारण जेनरेटर अभिव्यक्ति के साथ ऐसा करने में सक्षम होना चाहता हूँ। हालांकि जेनरेटर के साथ काम करते समय मुझे उप-गणना रखना मुश्किल लगता है। मुझे लगता है कि एक दो-चरणीय प्रक्रिया मुझे वहां ले सकती है, लेकिन अभी के लिए मैं फंस गया हूँ।

क्या ऐसा करने के लिए विशेष रूप से जेनरेटर के साथ एक विशेष रूप से सुरुचिपूर्ण/पायथनिक तरीका है?

+5

संदर्भ के लिए इस प्रक्रिया को कहा जाता है: http://en.wikipedia.org/wiki/Run-length_encoding –

उत्तर

43
>>> from itertools import groupby 
>>> L = [0, 0, 0, 3, 3, 2, 5, 2, 6, 6] 
>>> grouped_L = [(k, sum(1 for i in g)) for k,g in groupby(L)] 
>>> # Or (k, len(list(g))), but that creates an intermediate list 
>>> grouped_L 
[(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)] 

Batteries included, जैसा कि वे कहते हैं।

sum और JBernardo से जनरेटर अभिव्यक्ति का उपयोग करने के लिए सुझाव; टिप्पणी देखें।

+0

उत्कृष्ट, यह वही है जो मैं ढूंढ रहा था। मदद की सराहना करते हैं, बहुत बहुत धन्यवाद। –

+0

@ माचिन: ​​आपका स्वागत है! –

+9

+1, हो सकता है कि आप इंटरमीडिएट स्टोरेज से बचने के लिए 'लैन (सूची (जी)) '' योग (जी में 1 के लिए)' के लिए बदल सकें। – JBernardo

संबंधित मुद्दे

 संबंधित मुद्दे