2013-02-22 63 views
5

मुझे निम्न समस्या है। पूर्णांक की एक सूची होने के बाद, मैं इसे सूचियों की सूची में विभाजित करना चाहता हूं, जब भी मूल इनपुट सूची के दो तत्वों के बीच का चरण 1. उदाहरण के लिए: इनपुट = [0, 1, 3, 5, 6, 7], आउटपुट = [[0, 1], [3], [5, 6, 7]]पायथन: उनके बीच चरण पर आधारित पूर्णांक की विभाजित सूची

मैंने निम्नलिखित कार्य लिखा, लेकिन यह नरक के रूप में बदसूरत है, और मैं सोच रहा था कि आप में से कोई भी व्यक्ति मुझे एक अच्छा समाधान पाने में मदद करें। मैंने itertools का उपयोग करने की कोशिश की, लेकिन इसे हल नहीं कर सका।

def _get_parts(list_of_indices): 
    lv = list_of_indices 
    tuples = zip(lv[:-1], lv[1:]) 
    split_values = [] 
    for i in tuples: 
     if i[1] - i[0] != 1: 
      split_values.append(i[1]) 
    string = '/'.join([str(i) for i in lv]) 
    substrings = [] 
    for i in split_values: 
     part = string.split(str(i)) 
     substrings.append(part[0]) 
     string = string.lstrip(part[0]) 
    substrings.append(string) 
    result = [] 
    for i in substrings: 
     i = i.rstrip('/') 
     result.append([int(n) for n in i.split('/')]) 
    return result 

धन्यवाद एक बहुत:

यहाँ मेरी समाधान है!

उत्तर

7

यह किसी भी iterable

>>> from itertools import groupby, count 
>>> inp = [0, 1, 3, 5, 6, 7] 
>>> [list(g) for k, g in groupby(inp, key=lambda i,j=count(): i-next(j))] 
[[0, 1], [3], [5, 6, 7]] 
+4

अच्छा समाधान। मुझे लगता है कि विवरण उपयोगी होगा: 'j = count()' एक काउंटर बनाता है। 'अगली (जे)' के लिए प्रत्येक कॉल 1 से 0-स्पष्ट पायथन व्यवहार नहीं करेगा: फ़ंक्शन तर्क के लिए फ़ंक्शन तर्क के लिए डिफ़ॉल्ट मान एक बार बनाया गया है। इसलिए, 'j' को केवल एक बार गिनती() के साथ प्रारंभ किया जाएगा, अगली कॉल पर 'कुंजी' पर, arg' j' का पहले उदाहरण बनाया जाएगा। 'groupby'' inp' से सभी आइटमों को पुन: लागू करने के लिए जोड़ देगा, जिनके पास समान कुंजी मान है। यदि महत्वपूर्ण मूल्य बदल गया है - नया जी बनाया गया है। Inp से आइटम के लिए: आइटम = 0, कुंजी = 0-0 = 0; आइटम = 1, कुंजी = 1-1 = 0; आइटम = 3, कुंजी = 3-2 = 1; आइटम = 5, कुंजी = 5-3 = 2 और इसी तरह। – stalk

2
def _get_parts(i, step=1): 
    o = [] 
    for x in i: 
     if o and o[-1] and x - step == o[-1][-1]: 
      o[-1].append(x) 
     else: 
      o.append([x]) 
    return o 

_get_parts([0, 1, 3, 5, 6, 7], step=1) 
# [[0, 1], [3], [5, 6, 7]]) 
+0

धन्यवाद एक बहुत !!!!! – user1863555

0

यहाँ है एक समाधान पाश के लिए एक का उपयोग के साथ काम करता है।

def splitbystep(alist): 
    newlist = [[alist[0]]] 
    for i in range(1,len(alist)): 
    if alist[i] - alist[i-1] == 1: 
     newlist[-1].append(alist[i]) 
    else: 
     newlist.append([alist[i]]) 
    return newlist 
0

यह कैसे मैं यह कर होता है:

inp = [0, 1, 3, 5, 6, 7] 
base = [] 

for item in inp: 
    if not base or item - base[-1][-1] != 1: # If base is empty (first item) or diff isn't 1 
     base.append([item])     # Append a new list containing just one item 
    else: 
     base[-1].append(item)    # Otherwise, add current item to the last stored list in base 
print base         # => [[0, 1], [3], [5, 6, 7]]