如何检查项是否是python中迭代的最后一项

时间:2014-04-10 17:12:15

标签: python iteration

例如,我有一个字符串列表:

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)

4 个答案:

答案 0 :(得分:6)

', '.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

答案 1 :(得分:3)

我愿意(你可以做join,但这是不必要的,我认为这更优雅):

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

很少有人知道sep函数中的可选print参数 - 默认情况下它是一个空格。 *只需将list解压缩到要打印的单独项目中。

修改

关于循环的示例,您正在检查每次迭代的条件,这有点傻。

相反,只需迭代到倒数第二个元素(range(len(a)) - 1),然后在完成该循环时,再使用something_wrong()的最后一个元素调用a函数({{1 }})作为参数。

答案 2 :(得分: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!

希望这有帮助!

答案 3 :(得分:2)

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