您有一个数字列表,并且您想要过滤掉那些包含唯一数字的数字,即每个数字只能在数字中出现一次。
积极的例子:
反面例子:
你会怎么做?我自己的想法是将每个数字转换为字符串,然后检查由字符串的字符组成的集合的大小是否等于字符串的长度。这样的事情:
def uniques(numbers):
for number in numbers:
str_number = str(number)
if len(set(str_number)) == len(str_number):
yield number
for i in uniques(xrange(1000, 1050)):
print i
1023
1024
1025
1026
1027
1028
1029
1032
1034
1035
1036
1037
1038
1039
1042
1043
1045
1046
1047
1048
1049
有没有办法在不首先将整数转换为字符串的情况下执行此操作?
答案 0 :(得分:9)
有没有办法在不将整数转换为字符串的情况下执行此操作 首先然后将它们转换回来?
是的,您可以使用divmod
查找数字10,但这并不比您发布的方法快:
def uniques2(numbers):
for number in numbers:
seen = set()
quotient = number
while quotient > 10:
quotient, remainder = divmod(quotient, 10)
if remainder in seen:
break
else:
seen.add(remainder)
else:
yield number
答案 1 :(得分:5)
尝试:
def predicate(n):
s = repr(n)
return len(s) == len(set(s))
filtered_numbers = [ n for n in numbers if predicate(n) ]
或者,如果您更喜欢过滤功能:
filtered_numbers = filter(predicate, numbers)
或:
filtered_numbers = filter(lambda n: len(repr(n)) == len(set(repr(n))), numbers)
答案 2 :(得分:3)
如果您需要基于正则表达式的解决方案,请考虑以下正则表达式:
(?![\d.]*([\d.])[\d.]*\1)^[\d.]+$
即,如果没有重复的数字并且没有重复的小数点,则匹配一系列数字和句点。
更新(感谢@frb):在Python中编写它的正确方法是
re.match(r"(?![\d.]*([\d.])[\d.]*\1)^[\d.]+$",str_number).group(0)
答案 3 :(得分:0)
使用collections.Counter:
from collections import Counter
def unique(seq):
return any(x > 1 for x in Counter(seq).values())
这适用于任何序列,而不仅仅是字符串。
直到现在我才注意到你不想转换成字符串...不知道为什么,但我会让答案留下来。