alixon
alixon

Reputation: 21

How to construct a string from letters of each word from list?

I am wondering how to construct a string, which takes 1st letter of each word from list. Then it takes 2nd letter from each word etc. For example : Input --> my_list = ['good', 'bad', 'father'] Every word has different length (but the words in the list could have equal length) The output should be: 'gbfoaaodtdher'.

I tried:

def letters(my_list):
    string = ''

    for i in range(len(my_list)):
        for j in range(len(my_list)):
            string += my_list[j][i]

    return string

print(letters(['good', 'bad', 'father']))

and I got: 'gbfoaaodt'.

Upvotes: 2

Views: 74

Answers (3)

Talha Tayyab
Talha Tayyab

Reputation: 27910

We can do without zip_longest as well:

l = ['good', 'bad', 'father']
longest_string=max(l,key=len)
''.join(''.join([e[i] for e in l if len(e) > i]) for i in range(len(longest_string)))

#'gbfoaaodtdher'

Upvotes: 0

Alex P
Alex P

Reputation: 1155

The answer by @mozway is the best approach, but if you want to go along with your original method, this is how

def letters(my_list):
    string = ''

    max_len = max([len(s) for s in my_list])

    for i in range(max_len):
        for j in range(len(my_list)):
            if i < len(my_list[j]):
                string += my_list[j][i]

    return string

print(letters(['good', 'bad', 'father']))

Output: gbfoaaodtdher

Upvotes: 0

mozway
mozway

Reputation: 262359

That's a good job for itertools.zip_longest:

from itertools import zip_longest

s = ''.join([c for x in zip_longest(*my_list) for c in x if c])
print(s)

Or more_itertools.interleave_longest:

from more_itertools import interleave_longest

s = ''.join(interleave_longest(*my_list))
print(s)

Output: gbfoaaodtdher

Used input:

my_list = ['good', 'bad', 'father']

Upvotes: 1

Related Questions