def duplicate_count(s):
return len([c for c in set(s.lower()) if s.lower().count(c)>1])
我很难理解这段代码的工作原理。我正在进行代码检查挑战,以返回字符串中包含重复项的元素数。
例如。 Asasd - > 2
我提出了自己的建议,但我无法真正理解这段代码的作用。如果有人能指出我的方向,我将不胜感激:)
答案 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)