我有一个包含各种字符串值的列表。我希望在看到WORD
时拆分列表。结果将是一个列表列表(将是原始列表的子列表),其中只包含WORD
的一个实例我可以使用循环执行此操作但是有一个更多pythonic 方式要做到这一点吗?
示例= ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
result = [['A'], ['WORD','B','C'],['WORD','D']]
这是我尝试过但实际上并没有实现我想要的东西,因为它会将WORD
放在它应该位于的不同列表中:
def split_excel_cells(delimiter, cell_data):
result = []
temp = []
for cell in cell_data:
if cell == delimiter:
temp.append(cell)
result.append(temp)
temp = []
else:
temp.append(cell)
return result
答案 0 :(得分:19)
import itertools
lst = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
w = 'WORD'
spl = [list(y) for x, y in itertools.groupby(lst, lambda z: z == w) if not x]
这会创建一个没有分隔符的拆分列表,这对我来说更符合逻辑:
[['A'], ['B', 'C'], ['D']]
如果你坚持要包括分隔符,这应该可以解决问题:
spl = [[]]
for x, y in itertools.groupby(lst, lambda z: z == w):
if x: spl.append([])
spl[-1].extend(y)
答案 1 :(得分:11)
我会使用发电机:
def group(seq, sep):
g = []
for el in seq:
if el == sep:
yield g
g = []
g.append(el)
yield g
ex = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
result = list(group(ex, 'WORD'))
print(result)
打印
[['A'], ['WORD', 'B', 'C'], ['WORD', 'D']]
代码接受任何可迭代的,并产生一个可迭代的(如果你不想,你不会 将其展平成一个列表)。
答案 2 :(得分:1)
@ NPE的解决方案看起来非常pythonic对我来说。这是另一个使用itertools
:
from itertools import izip, chain
example = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
indices = [i for i,x in enumerate(example) if x=="WORD"]
pairs = izip(chain([0], indices), chain(indices, [None]))
result = [example[i:j] for i, j in pairs]
此代码主要基于this answer。
答案 3 :(得分:0)
给出
import more_itertools as mit
iterable = ["A", "WORD", "B" , "C" , "WORD" , "D"]
pred = lambda x: x == "WORD"
代码
list(mit.split_before(iterable, pred))
# [['A'], ['WORD', 'B', 'C'], ['WORD', 'D']]
more_itertools
是可通过> pip install more_itertools
安装的第三方库。
另请参阅split_at
和split_after
。