我无法弄清楚这些精简代码

时间:2017-12-18 03:10:57

标签: python python-3.x

def duplicate_count(s):
    return len([c for c in set(s.lower()) if s.lower().count(c)>1])

我很难理解这段代码的工作原理。我正在进行代码检查挑战,以返回字符串中包含重复项的元素数。

例如。 Asasd - > 2

我提出了自己的建议,但我无法真正理解这段代码的作用。如果有人能指出我的方向,我将不胜感激:)

3 个答案:

答案 0 :(得分:5)

首先,这是解决问题的效率极低的解决方案。但是让我们分解一下:

  • s.lower()会将字符串中的所有字符转换为小写字母:

    In [1]: s = "Hello, WORLD"
    
    In [2]: s.lower()
    Out[2]: 'hello, world'
    
  • set(s.lower())会在字符串中创建一个set(请务必阅读有关哪些集合) - 消除所有重复项:

    In [3]: set(s.lower())
    Out[3]: {' ', ',', 'd', 'e', 'h', 'l', 'o', 'r', 'w'}
    
  • for c in set(s.lower())遍历我们在上面创建的集合中的每个字符
  • 对于此集合中的每个字符,我们应用此条件:if s.lower().count(c)>1。这里的count(c)将计算字符串中c出现的次数。 >1帮助我们在字符串中留下超过1次的字符
  • [c for c in set(s.lower()) if s.lower().count(c)>1] 称为list comprehension 。它基本上是创建列表的简短方法。在这里,我们创建了一个多次出现在字符串中的字符列表。查看 this topic about how to verbalize and read the list comprehensions
  • len()然后只是获取列表的长度

总而言之,您迭代给定字符串中的唯一字符,并计算它们中的哪一个出现在字符串中不止一次。

答案 1 :(得分:1)

set(s.lower()) # gives unique elements in lower case

s.lower().count(c)>1 #checks if an element shows up more than once

总而言之,函数在字符串中查找非唯一元素的数量,忽略大小写。

我相信使用collections.Counter更有效:

In [7]: from collections import Counter

In [8]: sum(v > 1 for v in Counter("Aabcc".lower()).values())

Out[8]: 2

答案 2 :(得分:0)

def duplicate_count(s):

    result = []

    for c in set(s.lower()):
        if s.lower().count(c) > 1:
            result.append(c)

    return len(result)