在python中添加定界符

时间:2018-10-11 11:38:50

标签: python python-3.x list loops indexing

我对python很陌生,一直在尝试编写一些小代码,但还没有运气,所以我决定在这里发布。

我有一个看起来像这样的python列表:

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

我想在此列表中插入定界符“ x”。问题在于输出应如下所示:

['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 :(得分:3)

我会在枚举列表上使用生成器理解来生成
(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']

答案 1 :(得分:2)

我的第一个想法是使用所有可用于工作的火箭筒:

  • 使用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))通常是一个很大的禁忌BTW):

>>> 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张照片:

['a',
 'x',
 'b',
 'xx',
 'c',
 'xxx',
 'd',
 'xxxx',
 'e',
 'xxxxx',
 'f',
 'xxxxxx',
 'g',
 'xxxxxxx',
 'h',
 'xxxxxxxx']

答案 2 :(得分:1)

您可以使用它,创建一个临时列表(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)