Добавление разделителей в python - PullRequest
0 голосов
/ 11 октября 2018

Я очень плохо знаком с Python и пытался написать небольшой код, но пока не повезло, поэтому я решил опубликовать здесь.

У меня есть список Python, который выглядит примерно так:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

Я хочу вставить разделитель скажем «х» в этом списке.Проблема в том, что вывод должен выглядеть примерно так:

['a', 'x', 'b', 'xx', 'c', 'xxx', 'd', 'xxxx'] 

Вот код для одного x:

zz = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
print(zz)
print('letters with delimiters as x')
i = 1
while i < len(zz):
    zz.insert(i, 'x')
    i += 2
print(zz)

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Вы можете использовать это, создав временный список (new_zz) и добавив к нему.

zz = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
print(zz)
print('letters with delimiters as x')
new_zz = []
i = 0
while i < len(zz):
    new_zz.append(zz[i])
    new_zz.append('x' * (i + 1))
    i += 1
zz = new_zz
print(zz)
0 голосов
/ 11 октября 2018

Я бы использовал генераторское понимание перечислимого списка для получения
(character, 'x'*(index + 1)) кортежей, а затем сгладил бы результат.

>>> lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> [x for tup in ((c, 'x'*i) for i, c in enumerate(lst, 1)) for x in tup]
['a', 'x', 'b', 'xx', 'c', 'xxx', 'd', 'xxxx', 'e', 'xxxxx', 'f', 'xxxxxx', 'g', 'xxxxxxx', 'h', 'xxxxxxxx']

Теперь это может быть немного трудно читать и, вероятно,Лучше всего сделать в два шага, с выравниванием делегированным itertools.chain.from_iterable.

>>> from itertools import chain
>>> pairs = ((c, 'x'*i) for i, c in enumerate(lst, 1))
>>> list(chain.from_iterable(pairs))
['a', 'x', 'b', 'xx', 'c', 'xxx', 'd', 'xxxx', 'e', 'xxxxx', 'f', 'xxxxxx', 'g', 'xxxxxxx', 'h', 'xxxxxxxx']
0 голосов
/ 11 октября 2018

Моей первой идеей было использование всех базук, доступных для работы:

  • использование zip для чередования вашего списка и еще одного, сделанного из x, xx, xxx, ... сделано с использованием строкиумножение (используя генераторское понимание, чтобы избежать создания «жесткого» списка, нет необходимости)
  • используйте itertools.chain, чтобы сгладить полученные кортежи

следующим образом (первая попытка работает, новозможности для улучшения):

>>> lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> list(itertools.chain.from_iterable(zip(lst,("x"*(i+1) for i in range(len(lst))))))

вариант с использованием enumerate, а не zip, немного лучше (range(len(lst)), как правило, большой нет-нет, кстати):

>>> list(itertools.chain.from_iterable((v,"x"*i) for i,v in enumerate(lst,1)))

избегая chain, используя listcomp для сглаживания кортежей (вероятно, самая разумная альтернатива, определенно использующая больше букв, чем символов):

>>> [item for elts in ((v,"x"*i) for i,v in enumerate(lst,1)) for item in elts]

Все 3 print:

['a',
 'x',
 'b',
 'xx',
 'c',
 'xxx',
 'd',
 'xxxx',
 'e',
 'xxxxx',
 'f',
 'xxxxxx',
 'g',
 'xxxxxxx',
 'h',
 'xxxxxxxx']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...