我有这个列表(python):
[item1],[item2],[item3],[/],[item4],[item5],[item6],[/] ......等等。
我想将这些分成块,并且进入每个块的元素是分隔符之前的元素" /"。
所以我的块看起来像是:
chunk1:[ITEM1],[ITEM2],[项目3] chunk2:[ITEM4],[ITEM5],[ITEM6]
我已经尝试过,尝试过没有效率。尝试使用for和if元素循环遍历它[x] ==' /'然后得到一些职位。它非常脏,不能正常工作。
任何帮助都将不胜感激。
答案 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)