列出切片python

时间:2012-04-03 20:59:32

标签: python

我有一个像

这样的清单
myl = ['A','B','C','D','E','F'] #length always even

现在我想要的输出是'AB','CD','EF'

我试过

>>> myl = ['A','B','C','D','E','F']
>>> even_pos = myl[::2]
>>> odd_pos = myl[::-2]
>>> odd_pos.reverse()
>>> newlist = zip(even_pos,odd_pos)
>>> for x in newlist:
...     print "".join(list(x))
...
...
AB
CD
EF
>>>

我不喜欢这种方式,因为我觉得这太过分了。

那么,有没有更好的方法来实现我的输出。

5 个答案:

答案 0 :(得分:4)

您可以使用列表推导或生成器表达式简洁地完成此操作:

>>> myl = ['A','B','C','D','E','F']
>>> [''.join(myl[i:i+2]) for i in range(0, len(myl), 2)]
['AB', 'CD', 'EF']
>>> print '\n'.join(''.join(myl[i:i+2]) for i in range(0, len(myl), 2))
AB
CD
EF

对于此特定情况,您可以将''.join(myl[i:i+2])替换为myl[i] + myl[i+1],但如果您想要执行三个或更多的组,则使用''.join()方法会更容易。

或来自zip()的文档的替代方案:

>>> map(''.join, zip(*[iter(myl)]*2))
['AB', 'CD', 'EF']

答案 1 :(得分:3)

为什么你的方法如此复杂?你基本上可以做你所做的,但是在一行中,就像这样:

[ "".join(t) for t in zip(myl[::2], myl[1::2]) ]

F.J的回答更有效率。

答案 2 :(得分:1)

这个怎么样?

>>> ["%s%s" % (myl[c], myl[c+1]) for c in range(0, 6, 2)]
['AB', 'CD', 'EF']

答案 3 :(得分:1)

我可能会写:

[myl[i] + myl[i + 1] for i in xrange(len(myl), step=2)]

答案 4 :(得分:0)

您可以这样做:

myl = ['A','B','C','D','E','F']
[''.join(myl[i:i+2]) for i in range(0, len(myl), 2)]
print '\n'.join(''.join(myl[i:i+2]) for i in range(0, len(myl), 2))