У меня есть строка и список:

seq = '01202112'

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

Мне бы хотелось, чтобы каждый '2' заменял значение на соответствующий индекс в списке l таким образом, чтобы я получил две новые строки:

list_seq = [01001110, 01101110]

Используя .replace(), я мог бы перебирать l, но мне было интересно, есть ли более питонный способ получить list_seq?

3
amc 10 Дек 2016 в 23:02

4 ответа

Лучший ответ

Я не знаю, является ли это решение «более питоническим», но:

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] 
0
Yevhen Kuzmovych 10 Дек 2016 в 20:34
[''.join([str(next(digit, 0)) if x is '2' else x for x in seq])
 for digit in map(iter, l)]
1
chriscberks 10 Дек 2016 в 23:53
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]
-1
eyquem 10 Дек 2016 в 21:05

Я мог бы сделать что-то вроде этого:

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

Основная идея заключается в том, что мы вызываем iter, чтобы превратить кортежи в l в итераторы. В этот момент каждый раз, когда мы вызываем next для них, мы получаем следующий элемент, который нам нужно использовать вместо '2'.

Если это слишком компактно, логику может быть легче прочитать как функцию:

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

Дающий

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']

Спасибо @DanD в комментариях за то, что я заметил, что у меня всегда будет достаточно символов для заполнения! Мы последуем его предложению сохранить оригинальных персонажей, если у нас кончатся, но изменить этот подход, чтобы вести себя по-другому, просто и оставлено как упражнение для читателя. :-)

4
DSM 10 Дек 2016 в 20:46