例如,我想检查数字“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
然后我的“计数”将一直下降到 nine_count,如果任何计数为 0,则该数字不在“num”中。从我在这些网站上读到的内容来看,我的脚本效率很低 - 有人能指出更好的方法吗?
这个“数字”的东西需要一种字符串方法,而不是数字方法(让我想起一些Project Euler谜题)。
我会先用您号码的数字创建一个
set
(同时删除重复项)
s = set(str(4059304593))
然后检查数字:
print('2' in s)
(请注意,
in
对于 set
来说是高性能的)
然后,检查
s
是否包含所有013456789
数字:
print(s.issuperset("013456789"))
(如果必须多次执行此操作,可能值得使用字符串创建
set
,issuperset
会工作得更快)
您可以将号码转换为字符串,然后转换为集合以获得唯一的数字。
您只需迭代 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]
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
中
因为您只想找出哪些数字不在您的号码中:
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)})}
),这是通过将数字字符集映射到整数而创建的。如果您发现 {*...}
表示法 令人困惑,您可以随时使用 set(...)
来代替,这也适用于 Python 2.7+:
def not_in_number(n):
return set(range(10)) - set(map(int, set(str(n))))
另一种方法是将
-
与集合一起使用:
set('0123456789') - set(str(4059304593))
结果是整数之外的所有数字:
{'2', '7', '1', '6', '8'}
number = 4059304593
digit = 2
def hasDigit(number, digit):
while number > 0:
d = number % 10
if d == digit:
return True
number = number // 10
return False