をregex
この例のような質問を解決するには:(フードの内容を理解するためのコメントを参照してください):
import re
def find_sep(a):
'''Find the separator which is anything except numbers and "-" '''
# é, è, æ, etc ... are not a valid separators.
# Otherwise, add them to the next line in the regex rule
sep = re.findall(r'[a-zA-Z]', a[::-1])
if sep:
# Reverse the string
# And take the first part of the string if we find a separator
return a[::-1].split(sep[0])[0]
else:
# Return the string reversed
return a[::-1]
def average_backwards(a):
'''Reverse the string and calculate the average'''
# Find the seperator if exists and return an inversed string with numbers if they exists
b = find_sep(a)
# Find all the numbers
nums = re.findall(r'(\d+)', b[::-1])
if nums:
avg = round(sum(map(int, nums))/len(nums), 2)
return avg
return 0.0
# Test
nums = ["-1---2--b--3--04--", "-1---2--e--3--4--", "-1---2--A--3--A--", "-1---2--A--3----",
"-A---A--A--A--1--", "-A---A--A--+--1--", "-A---A--A--A--A--", "-A---2--A--A--A--",
"-5---4--3--2--1--", "-5-Z--4--3--2--1--", "-A---4--3------", "-A---4--c--2--1--",
"----4--A--2--1--", "-A---4--A--2--1--", "-5-Z--4-+3--2--1-"]
for num in nums:
print('{0} -> avg: {1}'.format(num, average_backwards(num)))
出力:
-1---2--b--3--04-- => 3.5
-1---2--e--3--4-- => 3.5
-1---2--A--3--A-- => 0.0
-1---2--A--3---- => 3.0
-A---A--A--A--1-- => 1.0
-A---A--A--+--1-- => 1.0
-A---A--A--A--A-- => 0.0
-A---2--A--A--A-- => 0.0
-5---4--3--2--1-- => 3.0
-5-Z--4--3--2--1-- => 2.5
-A---4--3------ => 3.5
-A---4--c--2--1-- => 1.5
----4--A--2--1-- => 1.5
-A---4--A--2--1-- => 1.5
-5-Z--4-+3--2--1- => 2.5
だから、あなたは合計を追跡するために必要な平均値を取得したい場合あなたが遭遇した桁数。 '.isdigit()'と '.isalpha()'を使って、文字が数字か文字かを調べることができます。数字に遭遇すると、その値を合計に記録し、手紙に出会うと、ループから脱出します。ループを終えたら、平均値を返します。これは、合計と桁数を使用して計算できます。数字がない場合は必ず考慮してください。そうでない場合は、ゼロで除算されます。 – user2896976
avgBackw( " - 1 --- 2 - A - 3--04--")のような特別な場合は、(40 + 3)/ 2 = 21.5を生成すると仮定して、またはちょうど3.5 – Gumboy
私たちが--A-1--45--4のような連続した数字を持つときはどうでしょうか? –