2013-02-22 42 views
5

Tôi gặp sự cố sau. Có một danh sách các số nguyên, tôi muốn chia nó thành một danh sách các danh sách, bất cứ khi nào bước giữa hai phần tử của danh sách đầu vào gốc không phải là 1. Ví dụ: input = [0, 1, 3, 5, 6, 7], output = [[0, 1], [3], [5, 6, 7]]Python: chia danh sách các số nguyên dựa trên bước giữa chúng

Tôi đã viết hàm sau, nhưng nó là một địa ngục, và tôi tự hỏi liệu có ai trong số các bạn sẽ giúp tôi có được một giải pháp đẹp hơn. Tôi đã cố gắng sử dụng itertools, nhưng không thể giải quyết nó.

Đây là giải pháp của tôi:

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 

Cảm ơn rất nhiều!

Trả lời

7

này làm việc với bất kỳ 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

Giải pháp tốt. Tôi nghĩ rằng mô tả sẽ hữu ích: 'j = count()' tạo ra một bộ đếm. Mọi lời gọi tới 'next (j)' sẽ trả về int bước bằng 1. Hành vi python không rõ ràng: giá trị mặc định cho đối số hàm được tạo một lần khi tạo hàm. Vì vậy, 'j' sẽ được khởi tạo với count() chỉ một lần, trong lần gọi tiếp theo tới' key', arg 'j' sẽ có cá thể được tạo trước đó. 'groupby' sẽ thêm vào' g' có thể lặp lại tất cả các mục từ 'inp', có cùng giá trị khóa. Nếu giá trị khóa đã thay đổi - g mới được tạo. Đối với các mục từ inp: item = 0, key = 0-0 = 0; item = 1, khóa = 1-1 = 0; mục = 3, khóa = 3-2 = 1; mục = 5, khóa = 5-3 = 2 v.v. – 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

Cảm ơn rất nhiều !!!!! – user1863555

0

Dưới đây là một giải pháp sử dụng một vòng lặp for.

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

Đây là cách tôi muốn làm điều đó:

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]] 
Các vấn đề liên quan