Reputation: 524
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
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
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
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