2011-07-12 18 views
5

में लंबाई एन के लगातार उप-अनुक्रमों को खोजें, मैं अनुक्रम में लंबाई एन के लगातार उप-अनुक्रमों को ढूंढना चाहता हूं।अनुक्रम

उदा। कहते हैं कि एन 3 था और दृश्य था:

[[0,1,7],[1,7,3],[7,3,4],[3,4,5],[4,5,10]] 

अग्रिम धन्यवाद:

[0,1,7,3,4,5,10] 

मैं एक समारोह है कि आउटपुट के रूप में उत्पादन होगा चाहते हैं!

+3

तुम क्या करने की कोशिश की है? वास्तव में काफी सरल लगता है। Iterate और प्रत्येक स्थिति में आकार n के बाद एक ले लो। –

उत्तर

13
>>> x = [0,1,7,3,4,5,10] 
>>> n = 3 
>>> zip(*(x[i:] for i in range(n))) 
[(0, 1, 7), (1, 7, 3), (7, 3, 4), (3, 4, 5), (4, 5, 10)] 

आप परिणाम एक सूची के बजाय tuples की सूची सूची होना चाहते हैं, map(list, zip(...)) का उपयोग करें।

+0

हाँ धन्यवाद शायद इसके बारे में सोचा जाना चाहिए ... – WillJones

+0

सुंदर। क्या आप मुझे बता सकते हैं कि * ज़िप कार्य में ऑपरेटर क्या करता है? –

+0

यह एक सूची को अनपैक करता है। अगर आप किसी फ़ंक्शन में तर्कों की एक सूची उत्तीर्ण कर रहे हैं, तो फिर भी यह एक व्यक्तिगत तर्क की अपेक्षा करता है – mossplix

12
>>> x = [0,1,7,3,4,5,10] 
>>> [x[n:n+3] for n in range(len(x)-2)] 
[[0, 1, 7], [1, 7, 3], [7, 3, 4], [3, 4, 5], [4, 5, 10]] 
+4

इस सामान्य को किसी भी बाद के आकार के लिए बनाने के लिए: '[x [i: i + n] i श्रेणी में (लेन (x) -n + 1)]' जहां 'n' बाद की वांछित लंबाई है। –

1
def subseqs(seq, length): 
    for i in xrange(len(seq) - length + 1): 
     yield seq[i:i+length] 

इसका इस्तेमाल आइक इस:

>>> for each in subseqs("hello", 3): 
...  print each 
... 
hel 
ell 
llo 

बेशक यह सूची के साथ भी काम करता है:

>>> list(subseqs([1, 2, 3, 4, 5, 6, 7, 8], 3)) 
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8]] 
1

निम्नलिखित सूट शायद हो सकता है आप के लिए:

def subseqs(xs, n): 
    all_seqs = (xs[i:j+1] for i, _ in enumerate(xs) for j, _ in enumerate(xs)) 
    return filter(lambda seq: len(seq) == n, all_seqs) 

>>> xs = [1, 2, 3, 4, 5, 6] # can be also range(1, 7) or list(range(1, 7)) 
>>> list(subseqs(xs, 3)) 
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]] 

या बस, एक सूची के सभी अनुक्रम प्राप्त करने के लिए na मेड 'XS':

[xs[i:j+1] for i, _ in enumerate(xs) for j, _ in enumerate(xs)] 

'XS' है कि केवल n लंबाई से हैं नामक एक सूची के दृश्यों हो रही के लिए:

[xs[i:j+1] for i, _ in enumerate(xs) for j, _ in enumerate(xs) if len(xs[i:j+1]) == n] 
संबंधित मुद्दे