将列表拆分为由分隔符确定的块

时间:2015-06-14 02:49:39

标签: python split

我有这个列表(python):

  

[item1],[item2],[item3],[/],[item4],[item5],[item6],[/] ......等等。

我想将这些分成块,并且进入每个块的元素是分隔符之前的元素" /"。

所以我的块看起来像是:

  

chunk1:[ITEM1],[ITEM2],[项目3]   chunk2:[ITEM4],[ITEM5],[ITEM6]

我已经尝试过,尝试过没有效率。尝试使用for和if元素循环遍历它[x] ==' /'然后得到一些职位。它非常脏,不能正常工作。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:10)

收集连续块的常用方法是使用itertools.groupby,例如:

>>> from itertools import groupby
>>> blist = ['item1', 'item2', 'item3', '/', 'item4', 'item5', 'item6', '/']
>>> chunks = (list(g) for k,g in groupby(blist, key=lambda x: x != '/') if k)
>>> for chunk in chunks:
...     print(chunk)
...     
['item1', 'item2', 'item3']
['item4', 'item5', 'item6']

(您对列表[item1],[item2],[item3],[/],的表示使列表中的每个元素看起来实际上都是一个列表,在这种情况下,相同的方法将起作用,您只需要与['/']进行比较或者你的分隔符是什么。)

答案 1 :(得分:2)

我写了一些更简单的东西让你理解 - 基本上要注意'/',如果它不存在,那么继续追加块。 itertools.groupby值得学习,但首先要理解的更简单的事情是一个好主意。

l = ['i1', 'i2', 'i3', '/', 'i4', 'i5', 'i6', '/']

chunks = []
x = 0
chunks.append([])   # create an empty chunk to which we'd append in the loop
for i in l:
    if i != '/':
        chunks[x].append(i)
    else:
        x += 1
        chunks.append([])

print chunks

如果你的元素是字符串,那么有一种更快的方法来完成我在python中所做的事情 - 基本上 - 首先创建一个' '(空格)分隔的字符串然后,首先按'/'拆分然后再次' '

l = ['i1', 'i2', 'i3', '/', 'i4', 'i5', 'i6', '/']

s = " ".join(l)  # first create a string, joining by a <space> it could be anything

chunks2 = [x.split() for x in s.split("/")]
print chunks2

答案 2 :(得分:2)

这也可以这样做(假设不需要空块,l是列表&#34; chunked&#34;):

chunks, last_chunk = [], []
for x in l:
    if x == '/':
         if last_chunk:
             chunks.append(last_chunk)
             last_chunk = []
    else:
         last_chunk.append(x)
if last_chunk:
    chunks.append(last_chunk)