【问题标题】:(Python 3) Splitting a list using unique elements as separators(Python 3) 使用唯一元素作为分隔符拆分列表
【发布时间】:2019-04-10 11:16:19
【问题描述】:

我有一个列表 l=[2,3,4,5,6,99,7,8,9,10,11,12,100,13,14,15,16,17,18,101],我想将 l 拆分为子列表 [2,3,4,5,6], [7,8,9,10,11,12],[13,14,15,16,17,18],这意味着我使用属于 separators = [99,100,101] 的“分隔符”数字 99,100,101 作为标志来指示我应该去哪里到下一个列表。

特别是,这些子列表可能具有不同数量的元素,但大小仅相差 1(5 或 6)。注意:分隔符可能超过 3 个。

在 Python 3 中有没有一种有效的方法来做到这一点?我想先提取分隔元素的索引,然后相应地对列表进行切片,但这似乎太复杂且计算量太大了..

一些见解会很棒!

添加(来自@Netwave 的建议):我的尝试(显然行不通):

g = []
for i in l:
    if i in separators:
        g += [l[:l.index(i)]]

输出:

>>> g
[[2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12], [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18]]

【问题讨论】:

  • 你已经尝试了什么?使用示例代码总是更容易回答。
  • 总是有这 3 个分隔符吗??
  • @Netwave 感谢您的建议,到目前为止,我已经添加了我的尝试,由于切片原因很明显,这不起作用:(
  • @EoinS 不,可能还有更多。我会相应地更新我的问题。谢谢!

标签: python python-3.x list slice


【解决方案1】:

使用groupby:

from itertools import groupby

separators = [99, 100, 101]
l = [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18, 101]

splits = [list(values) for key, values in groupby(l, key=lambda x: x not in separators) if key]

print(splits)

输出

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

【讨论】:

  • 感谢您提供清晰易懂的解决方案!它对我来说很好:)
【解决方案2】:

我希望您正在寻找类似于以下代码的内容。您需要遍历您的列表并继续检查该元素是否存在于分隔符列表中。这可以通过其他方式完成,正如您所说,通过遍历分隔符列表并找到主列表中元素的索引。为了简单起见,我采用了前一种方法。 (注意endindex变量的使用):

l=[2,3,4,5,6,99,7,8,9,10,11,12,100,13,14,15,16,17,18,101]
seperator = [99,100,101]

list_of_list = []
endindex = 0
for i in range(0,len(l),1):
    if l[i] in seperator:
        list_of_list.append(l[endindex:i])
        endindex = i + 1

print(list_of_list)

输出:

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

【讨论】:

  • 感谢您的回答!我选择接受另一个答案,因为它的计算成本可能更低,但是您的答案在更基础的层面上提供了洞察力,我真的很感激! :)
  • 不客气。帮助他人是主要动机:)
  • 我采用了您的第二种方法,但如果分隔符在两个列表中的顺序不同,则它可能不起作用。您迭代 l 的解决方案没有这个问题。分隔符值不必按照它们在列表中出现的顺序l
【解决方案3】:

更容易在函数中使用:

import itertools
def split(l,l2):
    return [list(v) for k,v in itertools.groupby(l,lambda x: x in l2) if not k]
l = [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18, 101]
print(split(l,[99, 100, 101]))

输出:

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

实现了Split a list into nested lists on a value的复制

【讨论】:

  • 感谢您的通知。我确实遇到了类似的问题,但我最终无法解释它.. :( 不过,感谢您有见地的回答!将接受@Daniel Mesejo 的回答,因为他稍早回答了
猜你喜欢
  • 2020-06-10
  • 2015-07-12
  • 1970-01-01
  • 2019-04-08
  • 2016-07-25
  • 1970-01-01
  • 2022-01-19
  • 2018-03-12
  • 2018-06-18
相关资源
最近更新 更多