amc
amc

Reputation: 833

Replace one item in a string with one item from a list

I have a string and a list:

seq = '01202112'

l = [(0,1,0),(1,1,0)]

I would like a pythonic way of replacing each '2' with the value at the corresponding index in the list l such that I obtain two new strings:

list_seq = [01001110, 01101110]

By using .replace(), I could iterate through l, but I wondered is there a more pythonic way to get list_seq?

Upvotes: 3

Views: 137

Answers (4)

chriscberks
chriscberks

Reputation: 425

[''.join([str(next(digit, 0)) if x is '2' else x for x in seq])
 for digit in map(iter, l)]

Upvotes: 1

eyquem
eyquem

Reputation: 27585

seq = '01202112'
li = [(0,1,0),(1,1,0)]

def grunch(s, tu):
    it = map(str,tu)
    return ''.join(next(it) if c=='2' else c for c in s)

list_seq = [grunch(seq,tu) for tu in li]

Upvotes: -1

DSM
DSM

Reputation: 353199

I might do something like this:

out = [''.join(c if c != '2' else str(next(f, c)) for c in seq) for f in map(iter, l)]

The basic idea is that we call iter to turn the tuples in l into iterators. At that point every time we call next on them, we get the next element we need to use instead of the '2'.

If this is too compact, the logic might be easier to read as a function:

def replace(seq, to_replace, fill):
    fill = iter(fill)
    for element in seq:
        if element != to_replace:
            yield element
        else:
            yield next(fill, element)

giving

In [32]: list(replace([1,2,3,2,2,3,1,2,4,2], to_replace=2, fill="apple"))
Out[32]: [1, 'a', 3, 'p', 'p', 3, 1, 'l', 4, 'e']

Thanks to @DanD in the comments for noting that I had assumed I'd always have enough characters to fill from! We'll follow his suggestion to keep the original characters if we run out, but modifying this approach to behave differently is straightforward and left as an exercise for the reader. :-)

Upvotes: 3

Yevhen Kuzmovych
Yevhen Kuzmovych

Reputation: 12140

I don't know if this solution is 'more pythonic' but:

def my_replace(s, c=None, *other):
        return s if c is None else my_replace(s.replace('2', str(c), 1), *other)


seq = '01202112'
l = [(0,1,0),(1,1,0)]

list_req = [my_replace(seq, *x) for x in l] 

Upvotes: 0

Related Questions