繁体   English   中英

如何在Python中的列表中提取相等的元素序列?

[英]How to extract an equal sequence of elements in a list in Python?

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

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

["h", "e", "l", "l", "o", "h", "e", "l", "l", "o", "h", "e", " l", "l", "o"]

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

[“你好”]

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

["b", "y", "e", "b", "y", "e", "b", "y", "e"]

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

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

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字符。

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

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

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

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

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']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM