2012-04-03 130 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