2012-04-03 133 views
1

我有一个像列表分片蟒蛇

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

,因为我觉得这样太,我不喜欢这种方式许多。

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

+3

可能重复[?你怎么分割成列表在Python均匀大小的块(http://stackoverflow.com/questions/312443/how-do -you-split-a-list-into-uniformity-sized-chunks-in-python) – bernie 2012-04-03 21:05:34

回答

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 

您可以用myl[i] + myl[i+1]取代''.join(myl[i:i+2])对于这种特殊情况下,但使用''.join()方法是,当你想要做的群体更容易三个或更多。

或者说来自文档zip()替代:

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

这个怎么样?

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

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

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

F.J的答案是更有效的,但。

+1

他的方法非常复杂,因为他很可能不知道列表解析,所以我不会责怪他。 – jdi 2012-04-03 21:07:24

+0

@jdi:是的,我不知道'列表解析',然后看到'mind = blown' – RanRag 2012-04-03 21:08:59

+0

@jdi:我实际上是在谈论采取'myl [:: - 2]'并扭转它以便得到奇数位置.. – cha0site 2012-04-03 21:09:21

1

我可能会写:

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

我会通过将它们加在一起来避免字符串连接。使用连接或字符串格式。另外,由于显式的x + 1索引,如果列表的大小不均匀,这将会中断。 – jdi 2012-04-03 21:09:00

+0

我不认为当你只添加两个字符串时,有任何理由避免用'+'来避免字符串连接。这不会导致二次行为,甚至可能会更快一些。 OP保证长度均匀。 – Taymon 2012-04-03 21:10:59

+0

但他并不保证列表的大小不能为10k。使用+的字符串连接速度很慢。甚至Guido说避免它:-) – jdi 2012-04-03 21:23:11