How to type negative number with .isdigit?

前端 未结 4 1387
无人及你
无人及你 2020-12-09 09:58

when I try this

if question.isdigit() is True:

I can type in numbers fine, and this would filter out alpha/alphanumeric strings

whe

相关标签:
4条回答
  • 2020-12-09 10:00

    If you do not wish to go for try... except, you could use regular expression

    if re.match("[+-]?\d", question) is not None:
        question = int(question)
    else:
        print "Not a valid number"
    

    With try... except, it is simpler:

    try:
        question = int(question)
    except ValueError:
        print "Not a valid number"
    

    If isdigit is must and you need to preserve the original value as well, you can either use lstrip as mentioned in an answer given. Another solution will be:

    if question[0]=="-":
        if question[1:].isdigit():
            print "Number"
    else:
        if question.isdigit():
            print "Number"
    
    0 讨论(0)
  • 2020-12-09 10:05

    I have just had a similar question on edabit where I realised that negative numbers returned as False whilst using isnumeric(). I have put my solution below: Create a function that takes a list of strings and integers, and filters out the list so that it returns a list of integers only.

    def filter_list(list):
        numbers = [i for i in list if str(i).isnumeric() == True]
        for i in list:
            try:
                int(i)
                if i <0:
                    numbers.append(i)
            except ValueError:
                continue
        return numbers
    list = [1,2,3,'a','b','c', -6, 0]
    print(filter_list(list))
    

    I am still new to Python so this is a basic attempt. Feel free to let me know if there is a much easier or better looking way.

    0 讨论(0)
  • 2020-12-09 10:14

    Use lstrip:

    question.lstrip("-").isdigit()
    

    Example:

    >>>'-6'.lstrip('-')
    '6'
    >>>'-6'.lstrip('-').isdigit()
    True
    

    You can lstrip('+-') if you want to consider +6 a valid digit.

    But I wouldn't use isdigit, you can try int(question), it'll throw an exception if the value cannot be represented as int:

    try:
        int(question)
    except ValueError:
        # not int
    
    0 讨论(0)
  • 2020-12-09 10:24

    Use a try/except, if we cannot cast to an int it will set is_dig to False:

    try:
        int(question)
        is_dig = True
    except ValueError:
        is_dig = False
    if is_dig:
      ......
    

    Or make a function:

    def is_digit(n):
        try:
            int(n)
            return True
        except ValueError:
            return  False
    
    if is_digit(question):
       ....
    

    Looking at your edit cast to int at the start,checking if the input is a digit and then casting is pointless, do it in one step:

    while a < 10: 
         try:
            question = int(input("What is {} {} {} ?".format(n1,op,n2)))
         except ValueError:
            print("Invalid input")
            continue # if we are here we ask user for input again
    
        ans = ops[op](n1, n2)
        n1 = random.randint(1,9)
        n2 = random.randint(1,9)
        op = random.choice(list(ops))
    
        if question ==  ans:
            print ("Well done")
        else:
            print("Wrong answer")
        a += 1
    

    Not sure what Z is doing at all but Z = Z + 0 is the same as not doing anything to Z at all 1 + 0 == 1

    Using a function to take the input we can just use range:

    def is_digit(n1,op,n2):
        while True:
            try:
                n = int(input("What is {} {} {} ?".format(n1,op,n2)))
                return n
            except ValueError:
                print("Invalid input")
    
    
    for _ in range(a):
        question = is_digit(n1,op,n2) # will only return a value when we get legal input
        ans = ops[op](n1, n2)
        n1 = random.randint(1,9)
        n2 = random.randint(1,9)
        op = random.choice(list(ops))
    
        if question ==  ans:
            print ("Well done")
        else:
            print("Wrong answer")
    
    0 讨论(0)
提交回复
热议问题