As I learn Python, I’m wondering if possible to define two functions in a single function?
I’ve made an attempt with the following code/MWE to simulate cleaning a dataset of dates:
#COMBINED FUNCTION
def combined_function(entry):
for char in bad_chars:
date = entry.replace(char,"")
if "-" in date:
split_date = date.split("-")
date_one = int(split_date[0])
date_two = int(split_date[1])
date = (date_one+date_two)/2
date = round(date)
else:
date = int(date)
return(date)
Unfortunately, when I attempt to run the new function on test_data
it does not appear to be yielding the correct results,
test_data = ["1912", "1929", "1913-1923",
"(1951)", "1994", "1934",
"c. 1915", "1995", "c. 1912",
"(1988)", "2002", "1957-1959",
"c. 1955.", "c. 1970's",
"C. 1990-1999"]
bad_chars = ["(",")","c","C",".","s","'", " "]
revised_date = []
for x in test_data:
date = combined_function(x)
revised_date.append(date)
print(revised_date)
Instead I receive the following traceback error,
ValueError: invalid literal for int() with base 10: '(1951)'
Looks like an issue in removing the bad_chars
?
Any thoughts/suggestions on where I went wrong? Thanks!
>Solution :
Just change your function parameter to date
, and replace the .replace
statement with date = date.replace(char,"")
.
Function should look like this:
def combined_function(date):
for char in bad_chars:
date = date.replace(char,"")
if "-" in date:
split_date = date.split("-")
date_one = int(split_date[0])
date_two = int(split_date[1])
date = (date_one+date_two)/2
date = round(date)
else:
date = int(date)
return(date)
Why is this happening??
Simply because date
is being replaced with entry
in every iteration which remains unchanged by .replace
statement.