【问题标题】:split a list in python在python中拆分列表
【发布时间】:2013-02-25 01:32:19
【问题描述】:

我有一个对象列表,我希望得到一个对象列表,使用另一个列表中的对象进行拆分,如下所示:

l = ['x',1,2,3,'a',5,6,1,7]

还有另一个对象列表

s = ['a', 1, 4]

我希望得到这样的结果:

[ ['x'], [1, 2, 3], ['a', 5, 6], [1, 7] ]

有没有一种不错的/pythonic 方式来做到这一点?

编辑:

我希望每个结果列表的头部都是s 的元素,并且所有这些列表都保持初始列表的元素顺序相同。

【问题讨论】:

  • 那么它是随机拆分还是第二个列表是切断单个列表的位置?我只是问,因为第一个列表中没有 4
  • 那么您想告诉我们您使用什么逻辑来拆分列表吗?
  • 你想要的东西。 check this
  • s 可以包含任何对象。问题是使用列表 s 中的对象拆分列表 l。
  • "问题是使用列表 l 中的对象拆分列表 l。"这并没有说明原始问题没有说明什么。例如,除非我遗漏了什么,否则如果s 中有两个对象在l 中连续,则您的示例不会显示您想要发生的情况。你想让['a', '1'][['a', '1']]还是[['a'], ['1']]

标签: python


【解决方案1】:

生成器会很快为您完成:

def split_on_members(seq, s):
    s = set(s)
    chunk = []
    for i in seq:
        if i in s and chunk:
            yield chunk
            chunk = []
        chunk.append(i)
    if chunk:
        yield chunk

给出:

>>> list(split_on_members(l, s))
[['x'], [1, 2, 3], ['a', 5, 6], [1, 7]]

当然,您可以只循环生成器而不创建完整列表:

>>> for group in split_on_members(l, s):
...     print group
... 
['x']
[1, 2, 3]
['a', 5, 6]
[1, 7]

【讨论】:

    【解决方案2】:

    试试这两个功能,

    1. “返回”类型

      def overlap_split_list(l,s):
          l1 = []
          l2 = []
          for i in l:
              if i in s:
                  l1.append(l2)
                  l2 = []
              l2.append(i)
          if l2: l1.append(l2)
          return l1
      
    2. 生成器类型

      def generator_overlap_split_list(l,s):
          l2 = []
          for i in l:
              if i in s:
                  yield l2
                  l2 = []
              l2.append(i)
          if l2: yield l2
      

    对于输出(都一样)

    print overlap_split_list(l,s)    
    print [i for i in generator_overlap_split_list(l,s)]
    print list(generator_overlap_split_list(l,s))
    

    【讨论】:

    • overlap_split_list 实际上是这里提交的所有函数中最快的。
    • @Gandaro 是的,因为没有“外力”作用于其上,即如果是发电机,则有来自外部的单独呼叫,这需要时间(进行呼叫)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多