2016-06-11 8 views
5

तो बदल की संख्या का पता लगाएंलगातार तत्वों है कि एक ही कर रहे हैं इससे पहले कि वे उदाहरण के लिए

a = [1,1,1,2,2] 
b = [1,1,2,2,2] 
c = [2,1,1,1,1] 

मैं सूची में पहले तत्व की सबसे लंबी लकीर प्राप्त करने के लिए, उदाहरण के a के लिए इतना चाहते हो जाएगा 3, b देगा 2 और c देगा 1. मुझे पता है कि मैं थोड़ी देर लूप बना सकता हूं और इस तरह की लकीर गिन सकता हूं, लेकिन मैं सोच रहा था कि ऐसा करने के लिए एक और शानदार तरीका है?

+0

यदि आप तो आप a.count ([0]) – amitnair92

+0

वाक्यांश का उपयोग कर सकते पहला तत्व के सभी उदाहरण गणना करना चाहते हैं "सबसे लंबे समय तक पहला तत्व की '* लकीर *' 'एक है थोड़ा संदिग्ध: क्या '[1,1,1,2,2,1,1,1,1,1] 'का जवाब 3 या 4 है। – ninjagecko

उत्तर

6

आप कुछ इस तरह कर सकता है:

numStreak = ([a[0] == n for n in a]+[False]).index(False) 

अद्यतन (यह भी सुनिश्चित करें कि अगर सभी तत्वों को पहले तत्व की तरह हैं, सूचकांक सही मूल्य वापस करता है): एक अधिक कुशल (लेकिन कम सुरुचिपूर्ण?) संस्करण

from itertools import takewhile 
len([1 for _ in takewhile(lambda x:x==a[0], a)]) 

या थोड़ा बेहतर (अद्यतन 2) @ vaultah के सुझाव:

sum(1 for _ in takewhile(lambda x:x==a[0], a)) 
+2

यह बहुत चालाक है लेकिन यह मुझे दुखी करता है कि यह पूरी सूची में फिर से शुरू होता है भले ही लंबाई केवल 1 है। –

+0

मैंने एक और अधिक कुशल जोड़ा है लेकिन हो सकता है कि थोड़ा कम सुरुचिपूर्ण संस्करण – DomTomCat

+0

'योग होना चाहिए (_ में लेने के लिए 1 (lambda x: x == a [0], a))' – vaultah

3

आप GroupBy का उपयोग करें और प्रत्येक के लिए पहले समूह में योग कितने आइटम हैं कर सकते हैं:

a = [1,1,1,2,2] 
b = [1,1,2,2,2] 
c = [2,1,1,1,1] 

from itertools import groupby 

for l in [a,b,c]: 
    print(sum(1 for _ in next(groupby(l), [[], []],)[1])) 

या इसका उपयोग करते takewhile:

from itertools import takewhile 

for l in [a, b, c]: 
    print(sum((1 for _ in takewhile(lambda x: x == l[0], l)))) 

अपने डेटा हमेशा एक सूची है, तो टपल आदि ग्रुपबी में आप झूठी मान की जांच कर सकते हैं क्योंकि next(.. में डिफ़ॉल्ट सेटिंग सेट करने के विपरीत:

for l in [a, b, c]: 
    print(sum(1 for _ in next(groupby(l))[1]) if l else 0) 
+0

मुझे समझ में नहीं आता है' [[], []]' अंश। यह क्या कर रहा है – DSM

+0

@DSM, यदि एक खाली पुनरावर्तनीय पारित किया गया है तो आपको 'स्टॉपइटरेशन' त्रुटि –

+0

आह मिलेगी, ठीक है, मैं देखता हूं कि आप अभी तक क्या कर रहे हैं। अगर हम जानते हैं कि हमारे पास अनुक्रम हैं तो मैं शायद अंत में 'अगर l else 0' जोड़ूं, लेकिन यह सामान्य सामान्य के मामले को संभाल नहीं पाएगा। – DSM

0

आप numpy इस्तेमाल कर सकते हैं:

>>> import numpy as np 
>>> a = [1,1,1,2,2] 
>>> b = [1,1,2,2,2] 
>>> c = [2,1,1,1,1] 
>>> def runs(data): 
... return np.split(data, np.where(np.diff(data) != 0)[0]+1) 
... 
>>> for e in a,b,c: 
... runs(np.array(e)) 
... 
[array([1, 1, 1]), array([2, 2])] 
[array([1, 1]), array([2, 2, 2])] 
[array([2]), array([1, 1, 1, 1])] 

तो बस पहली बार चलाने की लंबाई ले:

>>> def r(a): 
... i=1 
... while a[0]==a[i]: i+=1 
... return i 
... 
>>> r(a) 
3 
>>> r(b) 
2 
>>> r(c) 
1 
:

>>> for e in a,b,c: 
... len(runs(np.array(e))[0]) 
... 
3 
2 
1 

या, पायथन में, बस एक while पाश का उपयोग

1

सड़क के लिए एक लाइनर? उद्देश्य ले लो ...

a = [5,5,5,5,8] 
list(np.ediff1d(a)).count(0)+1 
>>> 4 
संबंधित मुद्दे