#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. Спасибо Патрику, этот подход работает очень хорошо.