Alex Nikitin
Alex Nikitin

Reputation: 524

Join pairs of elements of list in Python

I have a list:

list_to_transform = [['Start', 'двигаться', 'конгресс', 'сша'],
     ['Start', 'двигаться', 'сторона', 'в'],
     ['Start', 'двигаться', 'сторона', 'признание', 'суверенитет', 'израильский'],
     ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'на'],
     ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'оккупировать'],
     ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'Голанский'],
     ['Start', 'двигаться', 'сторона', 'признание', 'и']]

What i need is to combine each two words into single string, and if single word is left, combine it with previous two:

result =[['Start двигаться', 'конгресс сша'],
     ['Start двигаться', 'сторона в'],
     ['Start двигаться', 'сторона признание', 'суверенитет израильский'],
     ['Start двигаться', 'сторона признание', 'высот на'],
     ['Start двигаться', 'сторона признание', 'высот оккупировать'],
     ['Start двигаться', 'сторона признание', 'высот Голанский'],
     ['Start двигаться', 'сторона признание и']]

Is there some elegant way to do so? Any help would be appreciated!

Upvotes: 4

Views: 266

Answers (3)

hilberts_drinking_problem
hilberts_drinking_problem

Reputation: 11602

You can join adjacent words in a list of even length with map('{} {}'.format, lst[::2], lst[1::2]). The rest is handling the odd case and mapping over the lsit of lists.

lsts = [['Start', 'двигаться', 'конгресс', 'сша'],
     ['Start', 'двигаться', 'сторона', 'в'],
     ['Start', 'двигаться', 'сторона', 'признание', 'суверенитет', 'израильский'],
     ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'на'],
     ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'оккупировать'],
     ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'Голанский'],
     ['Start', 'двигаться', 'сторона', 'признание', 'и']]


def proc_single(lst):
    # join adjacent words
    res = list(map('{} {}'.format, lst[::2], lst[1::2]))
    # correct for lists with odd length
    if len(lst) % 2:
        res[-1] = '{} {}'.format(res[-1], lst[-1])

    return res

for lst in lsts:
    print(proc_single(lst))

# ['Start двигаться', 'конгресс сша']
# ['Start двигаться', 'сторона в']
# ['Start двигаться', 'сторона признание', 'суверенитет израильский']
# ['Start двигаться', 'сторона признание', 'высот на']
# ['Start двигаться', 'сторона признание', 'высот оккупировать']
# ['Start двигаться', 'сторона признание', 'высот Голанский']
# ['Start двигаться', 'сторона признание и']

Upvotes: 2

jpp
jpp

Reputation: 164623

You can use a nested list comprehension with an if / else clause to decide your indexer.

res = [[' '.join(i[k:(k+2 if k+3 != len(i) else k+3)])
        for k in range(0, len(i)-1, 2)] for i in lst]

print(res)

[['Start двигаться', 'конгресс сша'],
 ['Start двигаться', 'сторона в'],
 ['Start двигаться', 'сторона признание', 'суверенитет израильский'],
 ['Start двигаться', 'сторона признание', 'высот на'],
 ['Start двигаться', 'сторона признание', 'высот оккупировать'],
 ['Start двигаться', 'сторона признание', 'высот Голанский'],
 ['Start двигаться', 'сторона признание и']]

Upvotes: 1

Jean-François Fabre
Jean-François Fabre

Reputation: 140168

group the strings 2 by 2 in the inner list comprehension, use an outer list comprehension to iterate on the sublists.

Add a little trickery to join by 3 if reaches the end of the list so you don't have orphans. And make sure you're iterating up to an even range so the orphan isn't repeated (finetuned with trial and error :))

lst = [['Start', 'двигаться', 'конгресс', 'сша'],
     ['Start', 'двигаться', 'сторона', 'в'],
     ['Start', 'двигаться', 'сторона', 'признание', 'суверенитет', 'израильский'],
     ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'на'],
     ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'оккупировать'],
     ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'Голанский'],
     ['Start', 'двигаться', 'сторона', 'признание', 'и']]

result = [[" ".join(subl[i:i+(2 if i < len(subl)-3 else 3)]) for i in range(0,(len(subl)//2)*2,2)] for subl in lst]

result:

[['Start двигаться', 'конгресс сша'], ['Start двигаться', 'сторона в'],
 ['Start двигаться', 'сторона признание', 'суверенитет израильский'],
 ['Start двигаться', 'сторона признание', 'высот на'],
 ['Start двигаться', 'сторона признание', 'высот оккупировать'],
 ['Start двигаться', 'сторона признание', 'высот Голанский'],
 ['Start двигаться', 'сторона признание и']]

Upvotes: 1

Related Questions