【问题标题】:How to extract an equal sequence of elements in a list in Python?如何在 Python 中提取列表中相等的元素序列?
【发布时间】:2021-01-22 04:55:10
【问题描述】:

我有一个更具体的问题,但我还没有找到答案。我真的很绝望,如果有人知道答案,我会很高兴。提前感谢您的阅读...

我有一个 Python 列表,看起来像这样:

[“h”、“e”、“l”、“l”、“o”、“h”、“e”、“l”、“l”、“o”、“h”、“e” ", "l", "l", "o"]

现在我想缩短列表,以便过滤掉重复多次的元素块。这意味着该列表变为:

[“h”、“e”、“l”、“l”、“o”]

有人知道这是如何工作的吗?问题:列表总是看起来不同,可能是这样的:

[“b”、“y”、“e”、“b”、“y”、“e”、“b”、“y”、“e”]

非常感谢,非常感谢您的回答!

【问题讨论】:

  • 第一个条目总是重复模式的一部分吗?
  • 你使用大小写吗?如果你也需要,我可以整合它......

标签: python list python-2.7 indexing


【解决方案1】:

这可以用单行函数非常巧妙地处理(见下文)。

import re

def shorten(l):
  return list(re.sub(r'^([a-z]+)\1+$',r'\1', ''.join(l)))


l1 = ["h", "e", "l", "l", "o", "h", "e", "l", "l", "o", "h", "e", "l", "l", "o"]
l2 = ["b", "y", "e", "b", "y", "e", "b", "y", "e"]

print(shorten(l1))
print(shorten(l2))

输出

['h', 'e', 'l', 'l', 'o']
['b', 'y', 'e']

说明

上述解决方案将运行时传递的list (l) 视为按索引顺序排列的str 字符。

它利用正则表达式模式^([a-z]+)\1+$ 来识别整个str 是否由重复的子字符串组成——即l 是否由从头到尾的单个重复模式组成?

如果此模式在l str 上产生匹配,则返回代表此重复模式(匹配组1 (\1) 的list

如果没有匹配 - 即 l 不完全由单个重复模式组成 - 则返回与在运行时传递的 l 相同的 list

【讨论】:

    【解决方案2】:

    这是一个可能的解决方案:

    def shorten(lst):
        s = ''.join(lst)
        for i in range(1, int(len(s) / 2) + 1):
            if len(s) % i == 0:
                if s[0: i] * int(len(s) / i) == s:
                    return list(s[0: i])
        return list(s)
    

    这里有一些例子:

    >>> shorten(['h','e','l','l','o','h','e','l','l','o','h','e','l','l','o'])
    ['h', 'e', 'l', 'l', 'o']
    >>> shorten(['b','y','e','b','y','e'])
    ['b', 'y', 'e']
    >>> shorten(['a','b','c'])
    ['a', 'b', 'c']
    

    【讨论】:

    • 非常感谢! :-)
    • 对不起,但这不会通过所有场景ls = ["m","o","m","m","y","m","o","m","m","y"];shorten(ls)
    猜你喜欢
    • 2020-02-08
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2019-06-28
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多