测试字符串是否有重复字符

新手上路,请多包涵

我试图以最轻松的方式找出确定字符串是否有任何重复字符的最轻松的方法。我曾尝试搜索类似的问题,但找不到任何问题。它还需要尽可能缩短,因为我将检查相当多的字符串(我可以处理将其放入循环等)

例如:

 a = "12348546478"
#code to check multiple characters
print(result)

结果:重复8次,重复4次

该代码将检查重复的字符并打印出重复的内容。我不需要知道它重复了多少次,只需要知道它是否重复了。

原文由 Armageddon80 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 826
2 个回答

您可以使用 collections.Counter

 >>> from collections import Counter
>>> [i for i,j in Counter(a).items() if j>1]
['4', '8']

或者您可以使用自定义函数:

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

或者在集合理解中使用 str.count 方法:

 >>> set(i for i in a if a.count(i)>1)
set(['8', '4'])

所有方法的基准,它表明最后两种方式(自定义函数和集合理解比 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)

结果 :

 1st:  0.726881027222
2nd :  0.265578985214
3rd :  0.26243185997

我也尝试了长字符串( a = "12348546478"*10000 )并且仍然得到相同的结果:

 1st:  25.5780302721341
2nd :  11.8482989001177
3rd :  11.926538944245

无论如何,我的建议是使用更 pythonic 的集合理解:

 set(i for i in a if a.count(i)>1)

原文由 Mazdak 发布,翻译遵循 CC BY-SA 3.0 许可协议

或者你可以做

len(set(x)) == len(x)

这返回一个布尔值, True 如果字符串没有重复字符, False 否则。

set 类型不能有任何重复,所以当字符串变成一个时,它会被分解成字符。长度的差异显示有多少重复字符(但不是字符本身)

原文由 muddyfish 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏