如何检查python中两个连续数字是否相同

时间:2017-07-27 01:32:15

标签: python

我今天发现了这种做法:

检测支票号码是否有效。支票号码必须有10位数字,后面不能有2个或更多的零,也不能有3个以上的数字

我已经能够使用以下代码完成第一部分:

num_chk=input('Enter chk number: ')

if (len(num_chk) == 10):
    print('valid')
else:
    print('not valid')

关于如何创建逻辑以检查支票号码是否连续2次的任何想法。

感谢

6 个答案:

答案 0 :(得分:1)

我们说您的支票号是变量check_number,它是12300。

check_number = 12300

convert it to a string:

str_check_num = str(check_number)
# str_check_num now equals "12300" a a string
has_00 = "00" in str_check_num
# Returns True if "00" is in str_check_num. in this case it is.

答案 1 :(得分:1)

num_chkstr类型,可让您访问:

a in b - 如果字符串a在字符串b中,则返回True,例如'00' in num_chk

要检查尾随部分是否为一定数量的零,您可以尝试endswith或查看正则表达式(Python中的re包),如果您不知道它有多少个零可能是。

答案 2 :(得分:1)

您可以使用内置函数any()检查数字是否包含两个或更多个零,或三个或更多位数,例如:

if len(num) == 10:
    if any((x in num) for x in [str(i) + str(i) + str(i) for i in range(1, 10)]):
        print('invalid')

    elif '00' in num:
        print('invalid')

    else:
        print('valid')
else:
    print('invalid')
如果提供的任何表达式为any(),则

True会返回True

答案 3 :(得分:0)

使用 regex 来检测其他条件的解决方案,正如@Riaz所建议的那样,应该肯定比我要建议的更好,但为了完整起见,也可以使用 itertools.groupby 执行以下操作,grouped_L返回一个元组列表,其中包含一个数字,后跟连续重复项的数量(Reference)

from itertools import groupby

num = 1234567890  # Using input as an int
L = [int(x) for x in str(num)]
grouped_L = [(k, sum(1 for i in g)) for k,g in groupby(L)]

validity = True
if len(str(num)) == 10:
    for i in grouped_L:
        if (i[0]!=0 and i[1]>2):
            validity = False
            break
        elif (i[0]==0 and i[1]>1):
            validity = False
            break
        else:
            validity = True
else:
    validity = False

if validity:
    print('valid')
else:
    print('not valid')

答案 4 :(得分:0)

类似的东西:

>>> def check(num):
...     l=[str(i)+str(i) for i in range(10)]
...     l[0]='000'
...     if len(num)!=10: 
...             return "not valid"
...     else:
...             for i in l:
...                     if i in num:
...                             return "not valid"
...     return "valid"
... 
>>> n="1234567890"
>>> check(n)
'valid'
>>> n="1234500090"
>>> check(n)
'not valid'

答案 5 :(得分:0)

如果我理解了这个问题("后面有两个或更多的零"表示"两个或多个连续的零"?),则该数字必须正好为10位数。它不能有两个(或更多)连续的零。它必须不具有除零之外的三个(或更多)连续数字。 (三个连续的零意味着两个连续的零,因此由于第二个规则确实构成无效数字 - 我们不需要从上一次测试中排除零。)

那就是代码

def validate(s):
  # 10 characters
  if len(s) != 10:
    return False
  # all digits
  for c in s:
    if not c.isdigit():
      return False
  # no two or more consecutive '0'
  for a,b in zip(s[0:9],s[1:10]):
    if a == b == '0':
      return False
  # no three or more consecutive digits
  for a,b,c in zip(s[0:8],s[1:9],s[2:10]):
    if (a == b == c) and a.isdigit():
      return False
  #
  return True

TESTS = (
  '12345678x0',  # one character not digit
  '123456789',   # not 10 characters
  '1234567890',  # valid
  '1230067890',  # two consecutive zeroes
  '1224567890',  # valid
  '1114567890',  # three consecutive digits (other than zero)
)
for t in TESTS:
  print( t, 'valid' if validate(t) else 'not valid' )

n = raw_input("Enter number: ")
print( n, 'valid' if validate(n) else 'not valid' )