【问题标题】:Split '000111010010111' into ['000','111','0',1','00','1','0','111'] [duplicate]将'000111010010111'拆分为['000','111','0',1','00','1','0','111'] [重复]
【发布时间】:2020-03-03 01:44:45
【问题描述】:

是否有一些简洁的方法可以将一串 0 和 1 拆分为全 0 和全 1 的同类连续段?标题中的示例。

我当然可以使用嵌套循环、条件和.count() 方法来实现,但这似乎需要一个库函数。如果有的话,我只是不确定如何搜索它。

【问题讨论】:

  • 你可以用arr.split('0')arr.split('1')做一些聪明的事情
  • 您可以使用 numpy.diff 获取连续差异,然后使用 numpy.where 查找这些差异在哪里(不)为零。

标签: python-3.x


【解决方案1】:

是的,您可以使用 itertools.groupby

from itertools import groupby
a = "000111010010111"
result = ["".join(list(group)) for key, group in groupby(a)]

发生了什么?我们使用itertools.groupby 对连续术语进行分组。每次关键元素更改时都会创建一个新组(在您的示例中,当 0 变为 1 或 1 变为 0 时)。然后将内部列表连接起来以达到您想要的输出。

输出:

['000', '111', '0', '1', '00', '1', '0', '111']

这适用于任何字符串(不仅仅是 1 和 0),并且会根据项目的连续出现将它们组合在一起。

【讨论】:

    【解决方案2】:

    这是一种使用生成器函数的快速方法,易于阅读和理解,不涉及任何聪明之处。

    def split_me(s):
        temp=s[0]
        last=s[0]
        for l in s[1:]:
            if l==last:
                temp+=l
            else:
                yield temp
                temp=l
            last=l
        yield temp 
    
    print(list(split_me('000111010010111')))
    

    【讨论】:

    • 我看到您正在寻找图书馆电话,让我们看看是否有其他答案可以找到一些。
    【解决方案3】:

    来自re.split 的文档:

    如果在模式中使用捕获括号,则模式中所有组的文本也会作为结果列表的一部分返回

    s = '000111010010111'
    list(filter(None, re.split('(0+)', s)))
    # ['000', '111', '0', '1', '00', '1', '0', '111']
    
    s2 = '111110110110'
    list(filter(None, re.split('(0+)', s)))
    # ['11111', '0', '11', '0', '11', '0']
    

    filter 删除列表开头或结尾的空组

    【讨论】:

    • 这仅适用于以0 分隔的组,其他两个答案适用于任何字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多