Arm*_*n80 6 python collections python-3.x
我试图找出最轻的方法来确定一个字符串是否有任何重复的字符,尽可能以最轻的方式.我试图寻找类似的问题,但无法找到任何问题.它也需要是可能的短路方式,因为我将检查相当多的字符串(我可以处理将它放入循环等)
例如:
a = "12348546478"
#code to check multiple characters
print(result)
Run Code Online (Sandbox Code Playgroud)
结果:重复8次,重复4次
代码将检查重复的字符并打印出重复的内容.我不需要知道它重复了多少次,只是重复是否重复.
或者你也可以
len(set(x)) == len(x)
Run Code Online (Sandbox Code Playgroud)
True如果字符串没有重复字符,False则返回布尔值,否则返回.
该set类型不能有任何重复,因此当字符串变为一个时,它会被分解为字符.长度差异显示有多少重复字符(但不是字符本身)
您可以使用collections.Counter:
>>> from collections import Counter
>>> [i for i,j in Counter(a).items() if j>1]
['4', '8']
Run Code Online (Sandbox Code Playgroud)
或者您可以使用自定义函数:
>>> def finder(s):
... seen,yields=set(),set()
... for i in s:
... if i in seen:
... if i not in yields:
... yield i
... yields.add(i)
... else :
... yields.add(i)
... else:
... seen.add(i)
...
>>> list(finder(a))
['4', '8']
Run Code Online (Sandbox Code Playgroud)
str.count或者在集合理解中使用方法:
>>> set(i for i in a if a.count(i)>1)
set(['8', '4'])
Run Code Online (Sandbox Code Playgroud)
所有方法的基准,它表明最后两种方法(自定义函数和集合理解比 快得多Counter):
from timeit import timeit
s1="""
a = "12348546478"
[i for i,j in Counter(a).items() if j>1]
"""
s2="""
def finder(s):
seen,yields=set(),set()
for i in s:
if i in seen:
if i not in yields:
yield i
yields.add(i)
else :
yields.add(i)
else:
seen.add(i)
a = "12348546478"
list(finder(a))
"""
s3="""
a = "12348546478"
set(i for i in a if a.count(i)>1)
"""
print '1st: ' ,timeit(stmt=s1, number=100000,setup="from collections import Counter")
print '2nd : ',timeit(stmt=s2, number=100000)
print '3rd : ',timeit(stmt=s2, number=100000)
Run Code Online (Sandbox Code Playgroud)
结果 :
1st: 0.726881027222
2nd : 0.265578985214
3rd : 0.26243185997
Run Code Online (Sandbox Code Playgroud)
我也尝试过长字符串(a = "12348546478"*10000),但仍然得到相同的结果:
1st: 25.5780302721341
2nd : 11.8482989001177
3rd : 11.926538944245
Run Code Online (Sandbox Code Playgroud)
无论如何,我的建议是使用更Pythonic的集合理解:
set(i for i in a if a.count(i)>1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3446 次 |
| 最近记录: |