【问题标题】:Split a list into sublists on a value and keep the value将列表拆分为值的子列表并保留该值
【发布时间】:2014-04-01 20:29:45
【问题描述】:

我正在尝试根据值拆分列表并将其拆分的值保留在创建的子列表中。我找到了this solution 并试图对其进行更改,但我做不到。

import itertools


def isplit(iterable,splitters):
    return [list(g) for k,g in itertools.groupby(iterable,lambda x:x in splitters) if not k]

foo = [(0, 1), (1, 2), (2, 3), (0, 1),
 (2, 3), (1, 2), (1, 2), (0, 1), (2, 3),
 (1, 2), (2, 3), (0, 1), (2, 3), (0, 1),
 (1, 2), (2, 3), (1, 2), (0, 1)]

for k,g in itertools.groupby(foo,lambda x:x[0] in (0,)):
    if not k:
        print k,list(g)

以上代码返回

[(1, 2), (2, 3)]
[(2, 3), (1, 2), (1, 2)]
[(2, 3), (1, 2), (2, 3)]
[(2, 3)]
[(1, 2), (2, 3), (1, 2)]

我希望它返回:

[(0,1),(1, 2), (2, 3)]
[(0,1),(2, 3), (1, 2), (1, 2)]
[(0,1),(2, 3), (1, 2), (2, 3)]
[(0,1),(2, 3)]
[(0,1),(1, 2), (2, 3), (1, 2)]

我该怎么做?

【问题讨论】:

  • 你在哪里使用你的isplit函数?另外,请换行,这样您就不必向右滚动。
  • 其实我没有。那是我在其他地方找到的解决方案,底部的循环是我重写该解决方案。

标签: python list split list-comprehension


【解决方案1】:

存储拆分组:

>>> import itertools
>>> foo = [(0, 1), (1, 2), (2, 3), (0, 1), (2, 3), (1, 2), (1, 2), (0, 1), (2, 3), (1, 2), (2, 3), (0, 1), (2, 3), (0, 1), (1, 2), (2, 3), (1, 2), (0, 1)]
>>> splitpoint = []
>>> for k,g in itertools.groupby(foo,lambda x:x[0] in (0,)):
...     if k:
...         splitpoint = list(g)
...     else:
...         print splitpoint + list(g)
... 
[(0, 1), (1, 2), (2, 3)]
[(0, 1), (2, 3), (1, 2), (1, 2)]
[(0, 1), (2, 3), (1, 2), (2, 3)]
[(0, 1), (2, 3)]
[(0, 1), (1, 2), (2, 3), (1, 2)]

或创建您自己的生成器:

def group_splitter(it, key=None):
    if key is None:
        key = lambda x: x
    group = []
    for item in iter(it):
        if key(item) and group:
            yield group
            group = []
        group.append(item)
    if group:
        yield group

这也会产生最后一个 (0, 1) 元组:

>>> def group_splitter(it, key=None):
...     if key is None:
...         key = lambda x: x
...     group = []
...     for item in iter(it):
...         if key(item) and group:
...             yield group
...             group = []
...         group.append(item)
...     if group:
...         yield group
... 
>>> for g in group_splitter(foo, lambda x: x[0] == 0):
...     print g
... 
[(0, 1), (1, 2), (2, 3)]
[(0, 1), (2, 3), (1, 2), (1, 2)]
[(0, 1), (2, 3), (1, 2), (2, 3)]
[(0, 1), (2, 3)]
[(0, 1), (1, 2), (2, 3), (1, 2)]
[(0, 1)]

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 2017-12-24
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2015-05-13
    相关资源
    最近更新 更多