2010-10-19 24 views
6

में बराबर वस्तुओं के अनुक्रम की लंबाई निर्धारित मैं इस प्रकार एक सूची है:पायथन: सूची

l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2] 

मैं बराबर मदों की एक अनुक्रम की लंबाई, दी गई सूची में मैं उत्पादन चाहते हैं के लिए यानी निर्धारित करने के लिए चाहते हैं होने के लिए:

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

(या एक समान प्रारूप)।

मैंने defaultdict का उपयोग करने के बारे में सोचा लेकिन यह प्रत्येक आइटम की घटनाओं की गणना करता है और इसे पूरी सूची के लिए जमा करता है, क्योंकि मेरे पास एक से अधिक कुंजी '0' नहीं हो सकती है।

अभी, मेरी समाधान इस तरह दिखता है:

out = [] 
cnt = 0 

last_x = l[0] 
for x in l: 
    if x == last_x: 
     cnt += 1 
    else: 
     out.append((last_x, cnt)) 
     cnt = 1 
    last_x = x 
out.append((last_x, cnt)) 

print out 

मैं अगर वहाँ ऐसा करने का एक और अधिक pythonic तरीका है सोच रहा हूँ।

उत्तर

13

आप लगभग निश्चित रूप से itertools.groupby उपयोग करना चाहते हैं:

l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2] 
answer = [] 
for key, iter in itertools.groupby(l): 
    answer.append((key, len(list(iter)))) 

# answer is [(0, 6), (1, 6), (0, 4), (2, 3)] 

आप इसे और अधिक स्मृति कुशल बनाने, अभी तक अधिक जटिलता जोड़ना चाहते हैं, तो आप लंबाई समारोह जोड़ सकते हैं:

def length(l): 
    if hasattr(l, '__len__'): 
     return len(l) 
    else: 
     i = 0 
     for _ in l: 
      i += 1 
     return i 

l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2] 
answer = [] 
for key, iter in itertools.groupby(l): 
    answer.append((key, length(iter))) 

# answer is [(0, 6), (1, 6), (0, 4), (2, 3)] 

नोट यद्यपि कि मैंने लंबाई() फ़ंक्शन को बेंचमार्क नहीं किया है, और यह काफी संभव है कि यह आपको धीमा कर देगा।

+0

आप निम्न दो पंक्तियों के साथ दिखाए गए स्थान को बदलकर 'अन्यथा' की तुलना कर सकते हैं: 'i, _ में enumerate (l, 1): pass' के बाद' वापसी i'। – martineau

3

माइक जवाब अच्छा है, लेकिन itertools._grouper GroupBy द्वारा लौटाए गए तो वहाँ यह

मैं sum(1 for _ in i) का उपयोग itertools._grouper की लंबाई प्राप्त करने के लिए कोई मतलब नहीं है परीक्षण एक __len__ विधि है कभी नहीं होगा

>>> import itertools as it 
>>> L = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2] 
>>> [(k, sum(1 for _ in i)) for k, i in it.groupby(L)] 
[(0, 6), (1, 6), (0, 4), (2, 3)] 
+1

। । । बहुत अच्छा! – mshsayem

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