2013-10-20 118 views
1

比方說,我有一個列表:如何打印出每個列表的第一個字符,然後打印下一個字符

x = ['abc', 'd', 'efgh'] 

我試圖創建一個功能,使得其所需的輸出將返回:

a d e b f c g h 

這實質上是採取每個元素的第一個字符,然後跳到下一個元素,如果該區域沒有索引。

有沒有使用itertools或zip函數做這個W/O的替代方法?

我試着這樣做:

for i in x: 
     print(i[0], i[1], i[2]....etc) 

但由於列表的第二個元素超出範圍只給我一個錯誤。

謝謝!

回答

2

當然......仔細看,並試圖瞭解是怎麼回事...

out = [] 
biggest = max(len(item) for item in x) 
for i in range(biggest): 
    for item in x: 
     if len(item) > i: 
      out.append(item[i]) 

而非out,我會考慮yield在發電機回報的項目。

0

使用roundrobin recipe從itertools:

def roundrobin(*iterables): 
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 
    # Recipe credited to George Sakkis 
    pending = len(iterables) 
    nexts = cycle(iter(it).next for it in iterables) 
    while pending: 
     try: 
      for next in nexts: 
       yield next() 
     except StopIteration: 
      pending -= 1 
      nexts = cycle(islice(nexts, pending)) 

演示:

>>> x = ['abc', 'd', 'efgh'] 
>>> from itertools import cycle, islice 
>>> list(roundrobin(*x)) 
['a', 'd', 'e', 'b', 'f', 'c', 'g', 'h'] 

另一種選擇是使用itertools.izip_longestitertools.chain.from_iterable

>>> from itertools import izip_longest, chain 
>>> x = ['abc', 'd', 'efgh'] 
>>> sentinel = object() 
>>> [y for y in chain.from_iterable(izip_longest(*x, fillvalue=sentinel)) 
                  if y is not sentinel] 
['a', 'd', 'e', 'b', 'f', 'c', 'g', 'h'] 
+0

我會'y不是哨兵'...以防萬一'y'有一個時髦的定義'__ne__'。 (當然,這對絃樂無關緊要,但這是一個很好的習慣)。 – mgilson

+0

@mgilson感謝您解決這個問題,實際上在我的真實代碼中使用了'not',但是在這裏使用了'!=',因爲我對此有點懷疑。 ;-) –

+0

考慮你的觀衆:) – beroe