如何检查一个整数中是否包含特定数字

3

我想检查,例如数字'2'是否在4059304593中。

我的目的是检查整数中是否有1-9中的任何数字。这是我尝试过的:

for i in xrange(10):
    for j in xrange(100):
        num = str(i^j)
        one_count = 0
        two_count = 0
        for k in xrange(len(num)):
            if num[k] == 1:
                one_count += 1
            if num[k] == 2:
                two_count += 1                    

然后我的“counts”会一直减少到九个计数器,如果任何一个计数器为0,则该数字不在“num”中。从我在这些网站上阅读的信息来看,我的脚本可能效率低下,有人能指出更好的方法吗?


为什么不直接使用类似于str(digit_to_search) in str(searched_number)的方法呢?(也就是在字符串中进行线性搜索 = 字符列表) - sascha
1
抱歉,但数字“2”不在那个数字中。请问您再次寻找什么? - Bharel
为什么不先转换为字符串再转换为集合,然后执行差异操作呢? - Ignacio Vazquez-Abrams
基本上我想要的是一个接受数字作为输入,然后返回不在该数字中的数字(如果有的话)作为输出的东西。 - mrnovice
为什么 for ifor j 的缩进级别相同?是复制错误吗? - Barmar
是的,在脚本中不是那样的。 - mrnovice
5个回答

8
这个“数字”问题需要采用字符串方法,而不是数值方法(让我想起了一些Project Euler难题)。
首先,我会从你的数字中创建一个数字集合(同时删除重复项)。
s = set(str(4059304593))

然后检查数字:

print('2' in s)

请注意,对于set来说,使用in操作符的性能很高。

接下来,要检查s是否包含所有的013456789数字:

print(s.issuperset("013456789"))

如果必须多次执行此操作,创建一个包含该字符串的set可能会更有价值,issuperset将更快地工作。


3
有趣的是,除非数字非常长,否则制作一个集合可能并没有帮助,盈亏平衡点在37k-75k位数之间:repl.it - TemporalWolf
1
哈希和集合算法需要一定的时间才能被注意到,是的。 - Jean-François Fabre
Jean,这个方法对所有字符串都适用吗?无论是在Python 2还是3中,都可以用来查找是否缺少字符吗? - Tony
@TonyTannous 是的,对于你的所有问题都是这样。我尽可能地编写与版本无关的代码。 - Jean-François Fabre
我是盲目的。我写成了0而不是o,结果返回了false...无法看清原因。还是谢谢。 - Tony

2
你可以将数字转换为字符串,然后转换为集合以获取唯一的数字。
你只需在0-9中迭代数字,找到原始数字中不存在的数字即可:
>>> set(map(int,str(4059304593)))
set([0, 9, 3, 4, 5])
>>> digits = _
>>> [i for i in range(10) if i not in digits]
[1, 2, 6, 7, 8]

你甚至不需要将其转换为字符串。只需在字符上工作即可。 - Jean-François Fabre
不确定。检查我的答案以了解我的意思。顺便说一句,我学到了关于“_”的一些东西。当然:投票用完并且声望已达上限:我不能投票,你也不能给我声望 :) 但是无论如何,“set”方法都很好。好处在于您可以执行“2 in digits”,而我必须执行“'2' in digits”。 - Jean-François Fabre

1
L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
j = 0
nL = [0, 0, 0, 0, 0, 0, 0, 0, 0]
n = 1004 #number
while n:
    i = n%10
    nL[i] = 1
    n //= 10

输出

nL = [1, 1, 0, 0, 1, 0, 0, 0, 0, 0]

解释: 如果nL[i]为1,则第i位数字在n中。


我会使用 n//=10(整数的原地除法),这样可以在 Python 2 和 3 中都能正常工作。 - Jean-François Fabre
今天我已经用完了我的投票机会,抱歉让你失望了 :) 下一个小问题是:while (n!=0): => while n: - Jean-François Fabre
@Jean-FrançoisFabre :) 没关系。我习惯于提供有效答案,却得到了负分而不是正分 :P。好吧,我还有投票机会,我为你处理它作为字符串的方法点了一个赞。我又编辑了一下 :D - Tony

1

如果您只想找出数字中缺失的数字:

def not_in_number(n):
    return {*range(10)} - {*map(int, {*str(n)})}

使用方法:

>>> not_in_number(4059304593)
{1, 2, 6, 7, 8}

这将使用数字集合 ({*range(10)}),并从中减去您的数字的数字集合 ({*map(int, {*str(n)})}),通过将数字字符集映射为整数来创建。如果您发现{*...} notation令人困惑,您可以始终使用set(...)代替,它也适用于Python 2.7+:
def not_in_number(n):
    return set(range(10)) - set(map(int, set(str(n))))

1
我以前没有见过这样的符号。我尝试复制你的函数,但它产生了语法错误。 - mrnovice
啊,好的,那就是我的错误了。 - mrnovice
@mrnovice 啊,抱歉,我应该看到你正在使用xrange。如果你使用set()它会起作用的;我正在编辑我的答案。 - L3viathan

0
另一种方法是使用集合中的-运算符:
set('0123456789') - set(str(4059304593))

结果是您整数中不存在的所有数字:

{'2', '7', '1', '6', '8'}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接