如何将列表拆分为某个值

时间:2015-05-29 20:23:42

标签: python list

给定一个唯一的值列表,例如[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']

6 个答案:

答案 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'], []]