Arat254
Arat254

Reputation: 469

How to combine two elements of a list based on a given condition

I want to combine two elements in a list based on a given condition.

For example if I encounter the character 'a' in a list, I would like to combine it with the next element. The list:

['a', 'b', 'c', 'a', 'd']

becomes

['ab', 'c', 'ad']

Is there any quick way to do this?

One solution I have thought of is to create a new empty list and iterate through the first list. As we encounter the element 'a' in list 1, we join list1[index of a] and list1[index of a + 1] and append the result to list 2. However I wanted to know if there is any way to do it without creating a new list and copying values into it.

Upvotes: 2

Views: 5450

Answers (6)

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

Reputation: 140148

you could use itertools.groupby and group by:

  • letter follows a or
  • letter is not a

using enumerate to generate the current index, which allows to fetch the previous element from the list (creating a new list but one-liner)

import itertools

l = ['a', 'b', 'c', 'a', 'd']

print(["".join(x[1] for x in v) for _,v in itertools.groupby(enumerate(l),key=lambda t: (t[0] > 0 and l[t[0]-1]=='a') or t[1]=='a')])

result:

['ab', 'c', 'ad']

Upvotes: 0

ForceBru
ForceBru

Reputation: 44828

Well, if you don't want to create a new list so much, here we go:

from itertools import islice

a = list("abcdabdbac")

i = 0
for x, y in zip(a, islice(a, 1, None)):
    if x == 'a':
        a[i] = x + y
        i += 1
    elif y != 'a':
        a[i] = y
        i += 1

try:
    del a[i:]
except:
    pass

Upvotes: 0

MassPikeMike
MassPikeMike

Reputation: 682

If you don't want to use list comprehension to create a new list (maybe because your input list is huge) you could modify the list in-place:

i=0
while i < len(l):
 if l[i]=='a':
  l[i] += l.pop(i+1)
  i += 1

Upvotes: 3

EyuelDK
EyuelDK

Reputation: 3189

This does not create a new list, just modifies the existing one.

l = ['a', 'b', 'c', 'a', 'd']
for i in range(len(l)-2, -1, -1):
    if l[i] == 'a':
        l[i] = l[i] + l.pop(i+1)
print(l)

Upvotes: 4

Moses Koledoye
Moses Koledoye

Reputation: 78536

Use a list comprehension with an iterator on your list. When the current iteratee is a simply join it with the next item from the iterator using next:

l = ['a', 'b', 'c', 'a', 'd']

it = iter(l)
l[:] =  [i+next(it) if i == 'a' else i for i in it]
print l
# ['ab', 'c', 'ad']

Upvotes: 2

dikkini
dikkini

Reputation: 1182

This is easy way. Mb not pythonic way.

l1 = ['a', 'b', 'c', 'a', 'd']

do_combine = False
combine_element = None
for el in l1:
    if do_combine:
        indx = l1.index(el)
        l1[indx] = combine_element + el 
        do_combine = False
        l1.remove(combine_element)
    if el == 'a':
        combine_element = el
        do_combine = True

print(l1)
    # ['ab', 'c', 'ad']

Upvotes: -1

Related Questions