Я хочу извлечь все десятичные числа из строки в python 3, как я могу это сделать без использования регулярных выражений?

#python #string #function #casting

Вопрос:

Я создал эту простую программу с функциями для вычисления среднего, медианы и режима из списка чисел. Я хочу выбрать все десятичные числа, какими бы они ни были (10.00034, 1, $5.46, $0.90 или 0,5, например, из строки что-то вроде «5, 7 83 100, $5.07, и 7,834») из струны и бросил их в воду. Как я могу это сделать в Python 3? Я хочу записать все десятичные числа с начальными нулями в виде поплавков, включая их начальные нули.

 import string

def mode(x):
    if len(x) == 0:
        return 0
    else:
        theDictionary = {}
        for number in x:
            count = theDictionary.get(number, None)
            if count == None:
                theDictionary[number] = 1
            else:
                theDictionary[number] = count   1
        theMaximum = max(theDictionary.values())
        for key in theDictionary:
            if theDictionary[key] == theMaximum:
                print("Mode: ", key)
                return key


def median(x):
    if len(x) == 0:
        return 0
    else:
        x.sort()
        midpoint = len(x) // 2
        print("Median: ", end=" ")
        if len(x) % 2 == 1:
            print(x[midpoint])
            med = x[midpoint]
        else:
            print((x[midpoint]   x[midpoint - 1]) / 2)
            med = (x[midpoint]   x[midpoint - 1]) / 2
        return med


def mean(x):
    if len(x) == 0:
        return 0
    else:
        theSum = 0
        theSum = float(theSum)
        for number in x:
            theSum = theSum   number
        average = theSum / len(x)
        print("Mean: ", average)
        return average


def main():
    lyst = []
    print ("Enter a list of numbers or enter to quit: ")
    numbers = input()
    if numbers == "":
        return 0
    else:
        lyst = numbers.split()
        lyst = [float(x) for x in lyst]
        print("List: ", lyst)
        mode(lyst)
        median(lyst)
        mean(lyst)
        main()

if __name__ == "__main__":
    main()
 

Я попробовал несколько вещей, которые нашел здесь, на stackoverflow, и они не сработали, как, например, я пытался:

 def main():
    lyst = []
    print ("Enter a list of numbers or enter to quit: ")
    numbers = input()
    if numbers != "":
        for x in numbers.split():
            try:
                lyst.append(float(x))
            except ValueError:
                pass
        print("List: ", lyst)
        mode(lyst)
        median(lyst)
        mean(lyst)
        main()
    else:
        return 0
 

Любая помощь будет признательна.

Ответ №1:

Вам нужно отфильтровать входную строку. Один из способов сделать это:

 in_txt = "5, 7 83 100, $5.07, and 7.834"
in_filt = [x if x in "0123456789. -" else " " for x in in_txt]
in_join = str.join('', in_filt)
number = in_join.split()

print(in_filt, in_join, number, sep="n")
 

это оставляет числа и -. в целой строке заменяет все остальное пробелом:

 # in_filt
['5', ' ', ' ', '7', ' ', '8', '3', ' ', '1', '0', '0', ' ', ' ', ' ', 
 '5', '.', '0', '7', ' ', ' ', ' ', ' ', ' ', ' ', '7', '.', '8', '3', '4']

# in_join
5  7 83 100   5.07      7.834

# number
['5', '7', '83', '100', '5.07', '7.834']
 

Затем используйте ['5', '7', '83', '100', '5.07', '7.834'] и продолжайте преобразование с плавающей точкой.

Начальные нули в строках, которые становятся плавающими ( '0004.242' ), не будут плавающими, хотя — в качестве числа начальные 0 цифр не сохраняются.


Это все равно приведет к ошибкам, например "2021.07.25" , но для начала это не поплавок, поэтому вам следует сохранить свою попытку/улов.

Комментарии:

1. Спасибо Патрику, этот подход работает очень хорошо.