给定一个唯一的值列表,例如[5,4,9,2,1,7,'dog',9]
,有没有办法将它拆分为某个值?即
[5,4,9,2,7,'dog'].split(4)
= [5,4],[9,2,7,'dog']
[5,4,9,2,7,'dog'].split(2)
= [5,4,9,2], [7,'dog']
答案 0 :(得分:4)
>>> mylist = [5,4,9,2,7,'dog']
>>> def list_split(l, element):
... if l[-1] == element:
... return l, []
... delimiter = l.index(element)+1
... return l[:delimiter], l[delimiter:]
...
>>> list_split(mylist, 4)
([5, 4], [9, 2, 7, 'dog'])
>>> list_split(mylist, 2)
([5, 4, 9, 2], [7, 'dog'])
>>> list_split(mylist, 'dog')
([5, 4, 9, 2, 7, 'dog'], [])
答案 1 :(得分:2)
这是一个将列表拆分为任意数量的子列表并返回它们列表的函数,就像字符串拆分一样。
def split_list(input_list,seperator):
outer = []
inner = []
for elem in input_list:
if elem == separator:
if inner:
outer.append(inner)
inner = []
else:
inner.append(elem)
if inner:
outer.append(inner)
return outer
>>> split_list([1,2,3,4,1,2,3,4,4,3,4,3],3)
[[1, 2], [4, 1, 2], [4, 4], [4]]
如果要将分隔符元素保留在左侧的子列表中(如问题中专门提出的那样),则此变体将执行此操作:
def split_list(input_list,seperator):
outer = []
inner = []
for elem in input_list:
if elem == separator:
inner.append(elem)
outer.append(inner)
inner = []
else:
inner.append(elem)
if inner:
outer.append(inner)
return outer
>>> splitlist.split_list([1,2,3,4,1,2,3,4,4,3,4,3],3)
[[1, 2, 3], [4, 1, 2, 3], [4, 4, 3], [4, 3]]
答案 2 :(得分:1)
def listsplit(l, e):
try:
i = l.index(e) + 1
return l[:i], l[i:]
except ValueError:
return l
如果元素位于列表中的第一个或最后一个索引处,则其中一个返回的列表将为空,但我不完全确定这是否是一个问题。对于来自ValueError
调用的list.index
,您只返回列表本身,但如果需要其他行为,则更改非常简单。
答案 3 :(得分:0)
不是这样,但你可以很容易地使用索引方法切割你正在制作的列表,并获得你在示例输出中显示的结果。
>>> l1 = [5, 4, 9, 2, 7, 'dog']
>>> l1[:l1.index(4) + 1], l1[l1.index(4) + 1:]
([5, 4], [9, 2, 7, 'dog'])
'+1'是因为您希望针(4)出现在第一个列表中。
请注意,这会在第一个事件中分割,这很常见。如果您真的想要问题中的split
方法,可以使用类似的东西对列表进行子类化并编写自己的方法。
答案 4 :(得分:0)
在一行:
[x[k+1:x[k+1:len(x)].index(4)+len(x[:k+1])] for k in [c for c in [-1]+[i for i, a in enumerate(x) if a == 4]][:-1] ] + [x[(len(x) - 1) - x[::-1].index(4)+1:len(x)]]
功能:
def split_list(x, value):
return [x[k+1:x[k+1:len(x)].index(value)+len(x[:k+1])] for k in [c for c in [-1]+[i for i, a in enumerate(x) if a == value]][:-1] ] + [x[(len(x) - 1) - x[::-1].index(value)+1:len(x)]]
如果分隔符存在多次,它将起作用,并且在cas中它存在于lis的末尾或开头。
详细说明:
第1部分:[c for c in [-1]+[i for i, a in enumerate(x) if a == value]][:-1]
获取值出现的索引,追加" -1"在开头并删除最后一次出现的索引。
x[k+1:x[k+1:len(x)].index(value)+len(x[:k+1])]
从0开始第一次开始列表的切片(让小册子切片A)(这就是为什么我附加[-1] -1 + 1 = 0)然后从出现索引+1开始(为了使电流出现不可达)每个出现的索引都来自第1部分,然后我从另一个切片开始,从结束于列表末尾的当前发生的指数+1开始,然后我在这个切片中找到第一个出现的,I得到它;因为它是一个切片,我将当前偏移量(从开始+当前出现的指数+1的部分)添加到它,此时我得到停止的位置,这是切片A的结束。我终于得到了一个每次拆分。
我删除了最后一次出现的索引,因为它与在该索引之后计算任何东西无关,所以我只是把它们放在你的最后:+ [x[(len(x) - 1) - x[::-1].index(value)+1:len(x)]]
答案 5 :(得分:0)
使用切片:
def split_list(li, item):
if item not in li:
return li
else:
return [li[0:li.index(item)+1], li[li.index(item)+1:]]
测试:
for item in (5,4,2,'dog'):
print item, split_list([5,4,9,2,7,'dog'], item)
打印:
5 [[5], [4, 9, 2, 7, 'dog']]
4 [[5, 4], [9, 2, 7, 'dog']]
2 [[5, 4, 9, 2], [7, 'dog']]
dog [[5, 4, 9, 2, 7, 'dog'], []]