【问题标题】:Words in a list with consecutively repeated letters列表中具有连续重复字母的单词
【发布时间】:2017-11-16 21:59:41
【问题描述】:

现在我有一个例如列表

data = ['dog','cat','a','aa','aac','bbb','bcca','ffffff']  

我想删除重复字母的单词,我想删除其中的单词

'aa','aac','bbb','bcca','ffffff'

也许import re

【问题讨论】:

  • 抱歉,进行了修改。不是从第一个字符开始,而是任何地方都存在重复的字母
  • 请在收到有效答案后不要更改您的问题,如果更改会使这些答案无效!
  • 您可能想在您的问题中添加标题中的“连续重复”,并添加“abab”之类的词以明确(假设我是对的)您希望它保留.
  • 不要在中途再次编辑问题。如果您继续这样做,您的帖子将被关闭。在其他人花时间解决您的原始问题之后更改您的问题是非常不尊重他们的时间。

标签: python regex


【解决方案1】:

感谢这个帖子:Regex to determine if string is a single repeating character

这是重新版本,但如果任务像这样简单,我会坚持使用 PM2 ring 和 Tameem 的解决方案:

import re
data = ['dog','cat','a','aa','aac','bbb','bcca','ffffff']  
[i for i in data if not re.search(r'^(.)\1+$', i)]

输出

['dog', 'cat', 'a', 'aac', 'bcca']

还有一个:

import re
data = ['dog','cat','a','aa','aac','bbb','bcca','ffffff']  
[i for i in data if not re.search(r'((\w)\2{1,})', i)]

输出

['dog', 'cat', 'a']

【讨论】:

  • 不熟悉正则表达式,所以现在可能只会使用循环和集合。
  • @JieNiu 但这就是你错的地方。如果您有更多这些任务,Regex 是唯一的去处
  • @JieNiu 你选择的答案不处理'wow'之类的词
  • 酷。将查看 Regex 上的参考资料。谢谢。
  • @AntonvBR:到目前为止,它还不是“唯一可以去的地方”,但它确实是一个非常强大的工具。
【解决方案2】:

循环是要走的路。忘记集合,因为它们不适用于具有重复字母的单词。

这是一种您可以用来确定单词在单个循环中是否有效的方法:

def is_valid(word):
    last_char = None
    for i in word:
        if i == last_char:
            return False

        last_char = i

    return True

示例

In [28]: is_valid('dogo')
Out[28]: True

In [29]: is_valid('doo')
Out[29]: False

【讨论】:

    【解决方案3】:

    这个问题的原始版本想要删除完全由单个字符重复组成的单词。一种有效的方法是使用集合。我们将每个单词转换为一个集合,如果它仅包含单个字符,则该集合的长度将为 1。如果是这种情况,我们可以删除该单词,除非原始单词由单个字符组成。

    data = ['dog','cat','a','aa','aac','bbb','bcca','ffffff'] 
    newdata = [s for s in data if len(s) == 1 or len(set(s)) != 1]
    print(newdata)
    

    输出

    ['dog', 'cat', 'a', 'aac', 'bcca']
    

    这是您问题的新版本的代码,您想在其中删除包含任何重复字符的单词。这个比较简单,因为我们不需要对一个字符的单词做特殊的测试..

    data = ['dog','cat','a','aa','aac','bbb','bcca','ffffff'] 
    newdata = [s for s in data if len(set(s)) == len(s)]
    print(newdata)
    

    输出

    ['dog', 'cat', 'a']
    

    如果重复必须是连续的,我们可以使用groupby 来处理。

    from itertools import groupby
    
    data = ['dog','cat','a','aa','aac','bbb','bcca','ffffff', 'abab', 'wow'] 
    newdata = [s for s in data if max(len(list(g)) for _, g in groupby(s)) == 1]
    print(newdata)
    

    输出

    ['dog', 'cat', 'a', 'abab', 'wow']
    

    【讨论】:

    • sets 不考虑单词中的重复字母,所以它是不够的。
    • @AntonvBR 现在可以了。 ;)
    • @PM2Ring 是的,赞成。但是我认为 OP 从一开始就多次重复他的问题内容就不清楚了。
    【解决方案4】:

    这里有一个方法来检查是否有连续的重复字符:

    def has_consecutive_repeated_letters(word):
        return any(c1 == c2 for c1, c2 in zip(word, word[1:]))
    

    然后您可以使用列表推导来过滤您的列表:

    words = ['dog','cat','a','aa','aac','bbb','bcca','ffffff', 'abab', 'wow']
    [word for word in words if not has_consecutive_repeated_letters(word)]
    # ['dog', 'cat', 'a', 'abab', 'wow']
    

    【讨论】:

      【解决方案5】:

      只需要一行:)

      data = ['dog','cat','a','aa','aac','bbb','bcca','ffffff']  
      data =  [value for value in data if(len(set(value))!=1 or len(value) ==1)]
      print(data)
      

      输出

      ['dog', 'cat', 'a', 'aac', 'bcca']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2014-05-03
        • 2021-06-26
        • 2014-11-21
        • 2017-10-13
        • 1970-01-01
        相关资源
        最近更新 更多