I have this code but it is returning the first letter. I need the second and penultimate letter to be uppercase
def first_last_uppercase(array):
serie = pd.Series(array)
return serie.map(lambda x: x[0].upper() x[1:-1] x[-1].upper())
first_last_uppercase(languages)
Actual result:
0 PythoN
1 PhP
2 JavA
3 JavascripT
4 C
5 SqL
Expected result:
0 pYthOn
1 pHp
2 jAVa
3 jAvascriPt
4 c
5 sQl
any idea
CodePudding user response:
Remember Python is 0-indexed, so the 2nd element is 1
. The last element of an iterable is -1
, so the second-to-last is -2
. So, modify your return statement to say
return serie.map(lambda x: x[0] x[1].upper() x[2:-2] x[-2].upper() x[-1])
It's a little bulky, but I think it works for your input:
>>> x = ["python", "php", "java", "javascript", "c ", "sql"]
>>> serie = pd.Series(x)
>>> serie.map(lambda x: x[0] x[1].upper() x[2:-2] x[-2].upper() x[-1])
0 pYthOn
1 pHHp
2 jAVa
3 jAvascriPt
4 c
5 sQQl
Wait, it returned pHHp
, c
, and sQQl
for "php"
, "c "
, and "sql"
, respectively. If I try a 2-character string, like "c#"
, I get "c#C#"
. And if I try giving it just a single letter, like "c"
, it dies with an IndexError
.
You need to check the length of the string before you pass it to the lambda, which would be completely unreadable if you tried to put it all in a single lambda. Instead, define a function and use that.
def two_caps(thing: str) -> str:
if len(thing) > 3:
new_thing = thing[0] thing[1].upper() thing[2:-2] thing[-2].upper() thing[-1]
elif len(thing) == 3:
new_thing = thing[0] thing[1].upper() thing[2]
else:
new_thing = thing
return new_thing
This returns properly-capitalized strings for inputs >= 3. If the len()
is < 3, it returns the original thing. Now you can use this return statement:
return serie.Map(lambda x: two_caps(x))
and you should be good to go.
CodePudding user response:
Use capitalize
and slice the middle part with 1:-2
to get an empty string when the input is short.
def first_last_uppercase(array):
serie = pd.Series(array)
return serie.map(lambda x: x[0].lower() x[1:-2].capitalize() x[-2:].capitalize())
a = ["python", "php", "java", "javascript", "c ", "sql"]
first_last_uppercase(a)
Output:
0 pYthOn
1 pHp
2 jAVa
3 jAvascriPt
4 c
5 sQl
dtype: object