2011-05-01 99 views
71

我對python(幾個星期)相當陌生,並且遇到加入列表的問題。現在,我知道,一個列表可以加入到做一個長字符串,如:加入列表中的元素對 - Python

x = ['a', 'b', 'c', 'd'] 
print ''.join(x) 

顯然,這將輸出:

'abcd' 

然而,我所試圖做的是簡單地加入第一和列表中的第二個字符串,然後加入第三個和第四個等等。總之,從上面的例子中實現了輸出:

['ab', 'cd'] 

有沒有簡單的方法可以做到這一點?我也許應該提到,列表中字符串的長度是不可預知的,列表中字符串的數量也是不可預測的,儘管字符串的數量總是偶數。所以原始列表可能只是:

['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'] 

或其他。 反正,任何幫助都將不勝感激,所以在此先感謝。

+0

*「我也許應該還提到,字符串列表的長度將是不可預知的「* - 長度是否重要?即你只是想加入每一對列表元素,還是隻要結果元素保持在特定的長度限制以下,你是否真的想要查看內容並加入? – poke 2011-05-01 20:08:49

+0

簡單地加入每一對,我只是認爲不知道對的數量可能是一個問題 – John 2011-05-01 20:14:11

回答

66

您可以使用切片表示法與步驟:

>>> x = "abcdefghijklm" 
>>> x[0::2] #0. 2. 4... 
'acegikm' 
>>> x[1::2] #1. 3. 5 .. 
'bdfhjl' 
>>> [i+j for i,j in zip(x[::2], x[1::2])] # zip makes (0,1),(2,3) ... 
['ab', 'cd', 'ef', 'gh', 'ij', 'kl'] 

同樣的邏輯也適用於列表了。字符串長度無關緊要,因爲您只需將兩個字符串添加在一起。

+1

毫無疑問,凱維皮的答案是好得多。在這一個中,''x [::: 2]''創建一個對象,''x [1 :: 2]''創建另一個對象,這些創建可能基於引擎下的索引計算,在能夠獲得必須連接的連續元素對之前,必須將這兩個對象作爲參數傳遞給函數。在kevpie的回答中,只創建了一個迭代器,然後迭代從未觸摸列表的元素跳到另一個元素,而不必關心索引,而且這更加pythonic。 – eyquem 2014-04-07 12:47:52

+0

@eyquem,使用'itertools.islice'而不是[]來消除中間對象。但由於兩個答案在相同的條件下工作並且返回相同,他們都是正確的。 'zip(i [:: 2],i [1 :: 2])'對我來說看起來如此甜蜜,所以,爲什麼不呢? :) – utdemir 2014-06-09 15:08:35

1
>>> lst = ['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'] 
>>> print [lst[2*i]+lst[2*i+1] for i in range(len(lst)/2)] 
['abcde', 'fghijklmn', 'opqr'] 
2

沒有建立臨時名單:

>>> import itertools 
>>> s = 'abcdefgh' 
>>> si = iter(s) 
>>> [''.join(each) for each in itertools.izip(si, si)] 
['ab', 'cd', 'ef', 'gh'] 

或:

>>> import itertools 
>>> s = 'abcdefgh' 
>>> si = iter(s) 
>>> map(''.join, itertools.izip(si, si)) 
['ab', 'cd', 'ef', 'gh'] 
+0

不錯,但考慮到我的代碼留下我開始與原始列表無論如何,我認爲病選擇utdmr的....儘管 – John 2011-05-01 20:24:14

25

使用迭代器。

列表理解:

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']) 
>>> [c+next(si, '') for c in si] 
['abcde', 'fghijklmn', 'opqr'] 
  • 非常有效的內存使用。
  • S的恰好一個遍歷

發生器表達:

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']) 
>>> pair_iter = (c+next(si, '') for c in si) 
>>> pair_iter # can be used in a for loop 
<generator object at 0x4ccaa8> 
>>> list(pair_iter) 
['abcde', 'fghijklmn', 'opqr'] 
  • 用作迭代

使用地圖,STR .__ add__,ITER

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']) 
>>> map(str.__add__, si, si) 
['abcde', 'fghijklmn', 'opqr'] 

next(iterator[, default])可開始在Python 2.6

+2

到目前爲止,最好的答案。看到我對utdemir的回答的評論。 – eyquem 2014-04-07 12:50:01

1

嗯,我會做這種方式,因爲我沒有很好的與REGS ..

CODE

t = '1. eat, food\n\ 
7am\n\ 
2. brush, teeth\n\ 
8am\n\ 
3. crack, eggs\n\ 
1pm'.splitlines() 

print [i+j for i,j in zip(t[::2],t[1::2])] 

輸出:

['1. eat, food 7am', '2. brush, teeth 8am', '3. crack, eggs 1pm'] 

希望這有助於:)

4

僅僅是Python的:-)

>>> x = ['a1sd','23df','aaa','ccc','rrrr', 'ssss', 'e', ''] 
>>> [x[i] + x[i+1] for i in range(0,len(x),2)] 
['a1sd23df', 'aaaccc', 'rrrrssss', 'e'] 
的情況下,要驚慌,如果列表長度爲奇數,你可以嘗試

[x[i] + x[i+1] if not len(x) %2 else 'odd index' for i in range(0,len(x),2)] 

祝您好運