我有一个名为list_of_strings
的列表,如下所示:
['a', 'b', 'c', 'a', 'd', 'c', 'e']
我想将此列表拆分为一个值(在本例中为c
)。我还想在结果分割中保留c
。
所以预期的结果是:
[['a', 'b', 'c'], ['a', 'd', 'c'], ['e']]]
这么简单吗?
答案 0 :(得分:2)
您可以使用more_itertoools
简单明了地完成此操作:
from more_itertools import split_after
lst = ["a", "b", "c", "a", "d", "c", "e"]
list(split_after(lst, lambda x: x == "c"))
# [['a', 'b', 'c'], ['a', 'd', 'c'], ['e']]
另一个例子,我们只需更改predicate:
即可拆分单词lst = ["ant", "bat", "cat", "asp", "dog", "carp", "eel"]
list(split_after(lst, lambda x: x.startswith("c")))
# [['ant', 'bat', 'cat'], ['asp', 'dog', 'carp'], ['eel']]
答案 1 :(得分:2)
您可以尝试以下内容:
list_of_strings = ['a', 'b', 'c', 'a', 'd', 'c', 'e']
output = [[]]
for x in list_of_strings:
output[-1].append(x)
if x == 'c':
output.append([])
虽然应该注意,如果输入的最后一个元素是'c'
答案 2 :(得分:1)
def spliter(value, array):
res = []
while value in array:
index = array.index(value)
res.append(array[:index + 1])
array = array[index + 1:]
if array:
# Append last elements
res.append(array)
return res
a = ['a', 'b', 'c', 'a', 'd', 'c', 'e']
print(spliter('b',a))
# [['a', 'b'], ['c', 'a', 'd', 'c', 'e']]
print(spliter('c',a))
# [['a', 'b', 'c'], ['a', 'd', 'c'], ['e']]
答案 3 :(得分:1)
这个怎么样?它应该只迭代输入一次,其中一些是index
方法,它作为本机代码执行。
def splitkeep(v, c):
curr = 0
try:
nex = v.index(c)
while True:
yield v[curr: (nex + 1)]
curr = nex + 1
nex += v[curr:].index(c) + 1
except ValueError:
if v[curr:]: yield v[curr:]
print(list(splitkeep( ['a', 'b', 'c', 'a', 'd', 'c', 'e'], 'c')))
结果
[['a', 'b', 'c'], ['a', 'd', 'c'], ['e']]
如果最终值是您要拆分的值,我不确定您是否要在结果的末尾保留一个空列表。我做了一个假设,你不会,所以如果它是空的,我会排除最后一个值。
这导致输入[]
仅导致[]
,可能会导致[[]]
。
答案 4 :(得分:0)
这个相当有趣的脚本怎么样:
a = ['a', 'b', 'c', 'a', 'd', 'c', 'e']
b = ''.join(a).split('c') # ['ab', 'ad', 'e']
c = [x + 'c' if i < len(b)-1 else x for i, x in enumerate(b)] # ['abc', 'adc', 'e']
d = [list(x) for x in c if x]
print(d) # [['a', 'b', 'c'], ['a', 'd', 'c'], ['e']]
它还可以使用"c"
a = ['c', 'a', 'b', 'c', 'a', 'd', 'c', 'e', 'c']
d -> [['c'], ['a', 'b', 'c'], ['a', 'd', 'c'], ['e', 'c']]
答案 5 :(得分:0)
list_of_strings = ['a', 'b', 'c', 'a', 'd', 'c', 'e']
value = 'c'
new_list = []
temp_list = []
for item in list_of_strings:
if item is value:
temp_list.append(item)
new_list.append(temp_list[:])
temp_list.clear()
else:
temp_list.append(item)
if (temp_list):
new_list.append(temp_list)
print(new_list)
答案 6 :(得分:0)
stuff = ['a', 'b', 'c', 'a', 'd', 'c', 'e']
你可以像这样找到'c'
的索引,然后加1,因为你会在它之后拆分,而不是在它的索引处:
indices = [i + 1 for i, x in enumerate(stuff) if x == 'c']
然后像这样提取切片:
split_stuff = [stuff[i:j] for i, j in zip([0] + indices, indices + [None])]
zip
为您提供了类似于(indices[i], indices[i + 1])
的元组列表,其中连接的[0]
允许您提取第一部分,[None]
提取最后一个切片({ {1}})
答案 7 :(得分:0)
您可以尝试使用以下代码段。使用more_itertools
>>> l = ['a', 'b', 'c', 'a', 'd', 'c', 'e']
>>> from more_itertools import sliced
>>> list(sliced(l,l.index('c')+1))
输出是:
[['a', 'b', 'c'], ['a', 'd', 'c'], ['e']]