2013-08-14 41 views
5

Có bất kỳ libs python chuẩn nào cho phép bạn làm những việc như thế này không?Bất kỳ thư mục python chuẩn nào cung cấp chức năng nối 'n tham gia trên danh sách?

>>> [1,0,2,3,0,5,6].split([0]) 
>>> [[1],[2,3],[5,6]] 

>>> [[1],[2,3],[5,6]].join([0]) 
>>> [1,0,2,3,0,5,6] 

Với tôi, cảm giác đó là một điều khá cơ bản cần thiết thường xuyên. Lưu ý rằng các chuỗi hỗ trợ các phương thức này theo mặc định.

+0

Tò mò về lý do tại sao bạn đưa ra các đối số phương pháp của bạn trong danh sách các thành phần đơn '.split ([0])'. Bạn có tưởng tượng rằng các chức năng này có thể phân chia trên nhiều phần tử liên tiếp không? – MattH

+0

@MattH Điều này tương tự như phương thức tách cho chuỗi: ''spam'.split (' pa ')' trả về '[' s ',' m ']' –

+0

Thú vị. Dù sao, tôi tin rằng câu trả lời cho câu hỏi của bạn là: không, không có chức năng thư viện chuẩn nào để tách danh sách dựa trên chuỗi – MattH

Trả lời

1

Không chắc nếu có tích hợp chức năng có mặt để làm điều này một cách dễ dàng, nhưng bạn có thể sử dụng itertools:

>>> from itertools import groupby, chain, islice, cycle 
>>> lis = [1,0,2,3,0,5,6] 
>>> [list(g) for k, g in groupby(lis, key =lambda x: x==0) if not k] 
[[1], [2, 3], [5, 6]] 

>>> lis1 = [[1],[2,3],[5,6]] 
>>> c = [[0]]*(len(lis1) - 1) 
>>> list(chain.from_iterable(roundrobin(lis1, c))) 
[1, 0, 2, 3, 0, 5, 6] 

Roundrobin công thức được sử dụng trong điều thứ hai:

def roundrobin(*iterables): 
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 
    # Recipe credited to George Sakkis 
    pending = len(iterables) 
    nexts = cycle(iter(it).next for it in iterables) 
    while pending: 
     try: 
      for next in nexts: 
       yield next() 
     except StopIteration: 
      pending -= 1 
      nexts = cycle(islice(nexts, pending)) 
0

Đừng biết về libs chuẩn, đây là một giải pháp ít vụng về cho split

>>> a = [1, 0, 2, 3, 0, 5, 6] 
>>> ind = [-1] + [i for i, x in enumerate(a) if x == 0] + [len(a)] 
>>> [a[i + 1:j] for i, j in zip(ind, ind[1:])] 
[[1], [2, 3], [5, 6]] 

Đây là join

>>> l2 = [[1], [2, 3], [5, 6]] 
>>> [i for x in l2 for i in x + [0]][:-1] 
[1, 0, 2, 3, 0, 5, 6] 
Các vấn đề liên quan