2014-04-10 79 views
4

例如,我有一個字符串列表:如何檢查是否一個項目是迭代的蟒蛇最後一個

str_list =['one', 'two', 'three', 'four', 'five'] 

我想與打印所有的人都在屏幕上:

for c in str_list: 
    print c 
    print ', ' # word separator 

導致:

one, two, three, four, five, 

這裏,逗號是不在行的末尾必要的,我不希望打印。我如何修改上面的代碼不打印最後一個逗號?

它可與enumerate解決:

for idx, c in enumerate(str_list): 
    print c 
    if idx < len(str_list) - 1: 
     print ',' 

不過,我覺得有可能是來處理這更優雅的方式。

編輯: 也許我以爲我給了一個太簡單的例子。假設,如果我應該叫什麼函數x()爲每次迭代除了最後一個:

for idx, x in enumerate(list_x): 
    if idx < len(list_x) - 1: 
     something_right(x) 
    else: 
     something_wrong(x) 

回答

1

if idx < len(list_x) - 1:的一個問題是,它只適用於序列,不適用於任何迭代器。你可以編寫你自己的發電機,並告訴你是否到達最後。

def tag_last(iterable): 
    """Given some iterable, returns (last, item), where last is only 
    true if you are on the final iteration. 
    """ 
    iterator = iter(iterable) 
    gotone = False 
    try: 
     lookback = next(iterator) 
     gotone = True 
     while True: 
      cur = next(iterator) 
      yield False, lookback 
      lookback = cur 
    except StopIteration: 
     if gotone: 
      yield True, lookback 
     raise StopIteration() 

在Python 2它看起來像:

>>> for last, i in tag_last(xrange(4)): 
...  print(last, i) 
... 
(False, 0) 
(False, 1) 
(False, 2) 
(True, 3) 
>>> for last, i in tag_last(xrange(1)): 
...  print(last, i) 
... 
(True, 0) 
>>> for last, i in tag_last(xrange(0)): 
...  print(last, i) 
... 
>>> 
5

內的', '.join(['one', 'two', 'three', 'four', 'five'])有某種迭代;)

這實際上是最優雅的方式。

這裏的另一個問題:

# Everything except the last element 
for x in a[:-1]: 
    print(x + ', ', end='') 

# And the last element 
print(a[-1]) 

輸出one, two, three, four, five

+0

那麼,在這種情況下適合,謝謝。也許我以爲我舉了一個太簡單的例子。假設我應該爲每次迭代調用函數x(),除了最後一次迭代。 – Jeon

+0

@Jeon以另一種可能的方式更新 – vaultah

+0

似乎有趣。我會考慮的,謝謝。 – Jeon

3

我會做(你可以做join,但它是不必要的,這個我覺得是更優雅):

>>> print(*str_list, sep=', ') 
one, two, three, four, five 

很少有人知道print函數中的可選sep參數 - 默認情況下它是白色的空間。 *只是將list打開成單獨的項目打印。

編輯:

您就循環比如,你正在檢查在每次迭代,這是一個有點傻的條件。

相反,只是重複了倒數第二個元素(range(len(a)) - 1),然後當循環完成才調用something_wrong()函數的aa[-1])作爲參數的最後一個元素。

+0

非常感謝。我不喜歡使用'enumerate'的方式。所以我發佈了這個問題,看起來這是常見和普遍的方式。 – Jeon

+0

我再次編輯,我會添加一些改進,但不要讓他們打擾你太多。應該先讓整個代碼工作,然後再擔心優化。 @Jeon –

2

如果你正在尋找一個更通用的解決方案,以跳過最後一個元素,那麼這可能是有用的:

a = ['a','b','c','d'] 
for element,_ in zip(a, range(len(a) - 1)): 
    doSomethingRight(element) 
doSomethingWrong(a[-1]) 

說明:
zip將退出時列出的短耗盡。因此,通過循環播放arange一個項目的長度較短,您將爲除最後一個元素以外的所有元素設置doSomethingRight()。然後致電doSomethingWrong()查看最後一個元素。

在你的榜樣,

str_list = ['one', 'two', 'three', 'four', 'five'] 
word_seperator = ","; string_end = "!" 
result = "" 
for element,_ in zip(str_list, range(len(str_list) - 1)): 
    result += element + word_seperator # This is my 'doSomethingRight()' 
result += str_list[-1] + string_end # This is my 'doSomethingWrong()' 

結果:one,two,three,four,five!

希望這有助於!

相關問題