我对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)
答案 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)