didikimoiny225
didikimoiny225

Reputation: 23

How to uppercase even letter and lowercase odd letter in a string?

I am creating a function that takes in a string and returns a matching string where every even letter is uppercase and every odd letter is lowercase. The string only contains letters

I tried a for loop that loops through the length of the string with an if statement that checks if the index is even to return an upper letter of that index and if the index is odd to return a lowercase of that index.

def my_func(st):
    for index in range(len(st)):
        if index % 2 == 0:
            return st.upper()
        else:
            return st.lower()

I expected to have even letters capitalize and odd letter lowercase but I only get uppercase for the whole string.

Upvotes: 2

Views: 41482

Answers (10)

Kevin Parker
Kevin Parker

Reputation: 11

You can deconstruct string into collection of characters, apply transformations and reconstruct string back from them

Logic:

  • First enumerate() over the string to generate key-value pairs of characters and their positions
  • Then use comprehensions to loop over them and use conditional statement to return odd position characters in lower() case and even position in upper()
  • Now you have the list ready. Just join() it with an empty string '' to convert the list into a string

Code:

str = 'testing'
''.join([y.upper() if x%2 ==0 else y.lower() for x,y in enumerate(str)])

Upvotes: 0

Hari Prasath
Hari Prasath

Reputation: 11

l = 'YourString'
li=[]
for index,i in enumerate(l):
    if index % 2 == 0:
        i=i.lower()
        li.append(i)
    elif index % 2 == 1:
        i=i.upper() 
        li.append(i)
print(''.join(li))

Use this enumerate method to perform your operation

Upvotes: 1

hrishikesh chaudhari
hrishikesh chaudhari

Reputation: 906

def myfunc(a):
    newString = ''
    for count, ele in enumerate(a, 0):
        if count %2 == 0:
            newString += (a[count].lower())
        else:
            newString += ((a[count].upper()))
    return newString

Upvotes: 0

bhargav chowdary
bhargav chowdary

Reputation: 11

def myfunc(str):
    rstr = ''
    for i in range(len(str) ):
        if i % 2 == 0 :
            # str[i].upper()
            rstr = rstr + str[i].upper()
        else:  
            #str[i].lower()
            rstr = rstr + str[i].lower()
    return rstr        

Upvotes: 1

Shantanu Joshi
Shantanu Joshi

Reputation: 1

The below code should do what you are looking for.

def myfunc(name):
    str=""

    lc=1;

    for character in name:

        if(lc%2==0):
            str+=character.upper()
        else:
            str+=character.lower()
        lc+=1
    return str

Upvotes: 0

Anjali Shyamsundar
Anjali Shyamsundar

Reputation: 555

Tweaking your code a bit, You can use the 'enumerate' and keep appending to the string based on the condition evaluations( for me this was easier since I have been coding in java :))

def myfunc(st):
str=''
for index, l in enumerate(st):
    if index % 2 == 0:
        str+=l.upper()
    else:
        str+=l.lower()
return str

Upvotes: 2

Alain T.
Alain T.

Reputation: 42133

You can use a bitwise and (&) to check for odd positions. The enumerate function will give you both the positions and the characters so you can easily use it in a list comprehension:

def upLow(s):
    return "".join(c.lower() if i&1 else c.upper() for i,c in enumerate(s))
upLow("HelloWorld") # HeLlOwOrLd

Upvotes: 0

Devesh Kumar Singh
Devesh Kumar Singh

Reputation: 20500

Some issues in your code:

  • Currently you are returning from the function on the first index itself, i.e index=0 when you do return st.lower(), so the function will stop executing after it encounters the first index and breaks out of the for loop

  • Doing st.lower() or st.upper() ends up uppercasing/lowercasing the whole string, instead you want to uppercase/lowercase individual characters

One approach will be to loop over the string, collect all modified characters in a list, convert that list to a string via str.join and then return the result at the end

You also want to refer to each individual characters via the index.

def my_func(st):

    res = []
    #Iterate over the character
    for index in range(len(st)):
        if index % 2 == 0:
            #Refer to each character via index and append modified character to list
            res.append(st[index].upper())
        else:
            res.append(st[index].lower())

    #Join the list into a string and return
    return ''.join(res)

You can also iterate over the indexes and character simultaneously using enumerate

def my_func(st):

    res = []
    #Iterate over the characters
    for index, c in enumerate(st):
        if index % 2 == 0:
            #Refer to each character via index and append modified character to list
            res.append(c.upper())
        else:
            res.append(c.lower())

    #Join the list into a string and return
    return ''.join(res)
print(my_func('helloworld'))

The output will be

HeLlOwOrLd

Upvotes: 10

Austin
Austin

Reputation: 26037

You can store your operations beforehand and use them in join with enumerate:

def my_func(st):
    operations = (str.lower, str.upper)
    return ''.join(operations[i%2](x) for i, x in enumerate(st))

print(my_func('austin'))
# aUsTiN

Upvotes: 3

Scott Hunter
Scott Hunter

Reputation: 49893

  • return will terminate your function, so there isn't much point of the loop
  • st is the whole string, so st.upper() will yield the whole string in upper case.

Upvotes: 0

Related Questions