检测python中的dictionary.iteritems()上的最后一次迭代

时间:2011-05-22 20:02:14

标签: python dictionary

是否有一种简单的方法可以在使用iteritems()迭代字典时检测最后一次迭代?

11 个答案:

答案 0 :(得分:11)

有一种丑陋的方式可以做到这一点:

for i, (k, v) in enumerate(your_dict.iteritems()):
    if i == len(your_dict)-1:
        # do special stuff here

但你应该考虑是否需要这个。我几乎可以肯定还有另一种方式。

答案 1 :(得分:2)

it = spam_dict.iteritems()
try:
    eggs1 = it.next()
    while True:
        eggs2 = it.next()
        do_something(eggs1)
        eggs1 = eggs2
except StopIteration:
    do_final(eggs1)

快速又脏。它能解决你的问题吗?

答案 2 :(得分:1)

正如其他人所说,词典没有明确的顺序,所以很难想象为什么你会需要这个,但这里是

last = None
for current in your_dict.iteritems():
  if last is not None:
    # process last
  last = current

# now last contains the last thing in dict.iteritems()
if last is not None: # this could happen if the dict was empty
  # process the last item

答案 3 :(得分:1)

我最近有这个问题,我认为这是最优雅的解决方案,因为它允许你写for i,value,isLast in lastEnumerate(...):

def lastEnumerate(iterator):
    x = list(iterator)
    for i,value in enumerate(x):
        yield i,value,i==len(x)-1

例如:

for i,value,isLast in lastEnumerate(range(5)):
    print(value)
    if not isLast:
        print(',')

答案 4 :(得分:1)

这是this broader question的一个特例。我的建议是创建一个enumerate-like generator,在最后一项上返回-1:

def annotate(gen):
    prev_i, prev_val = 0, gen.next()
    for i, val in enumerate(gen, start=1):
        yield prev_i, prev_val
        prev_i, prev_val = i, val
    yield '-1', prev_val

如果您希望它处理序列和生成器,请添加gen = iter(gen)

答案 5 :(得分:1)

我知道这很晚,但这就是我如何解决这个问题:

dictItemCount = len(dict)
dictPosition = 1
for key,value in dict
    if(dictPosition = dictItemCount):
        print 'last item in dictionary'
    dictPosition += 1

答案 6 :(得分:0)

最有意义的方法是将循环包装在一个包含钩子的调用中,以便之后调用迭代后的功能。

这可以作为上下文管理器实现,并通过'with'语句调用,或者对于旧版本的Python,您可以使用旧的'try:'...'finally:'构造。它也可以包含在自动调度字典迭代的类中(“私有”方法),附录代码在公共方法中跟随。 (理解公共与私有之间的扩张是意图和文档的问题,而不是Python的强制执行。)

答案 7 :(得分:0)

for循环中的最后一项仍然在for循环之后挂起:

for current_item in my_dict:
    do_something(current_item)

try:
    do_last(current_item)
except NameError:
    print "my_dict was empty"

即使在for循环之前使用名称“current_item”,尝试循环空dict似乎也会删除current_item,因此NameError

答案 8 :(得分:0)

您在上面的注释中声明,您需要这样来构造SQL SELECT语句的WHERE子句。也许这会有所帮助:

def make_filter(colname, value):
    if isinstance(value, str):
        if '%' in value:
            return "%s LIKE '%s'" % (colname, value)
        else:
            return "%s = '%s'" % (colname, value)
    return "%s = %s" % (colname, value)

filters = {'USER_ID':'123456', 'CHECK_NUM':23459, 'CHECK_STATUS':'C%'}
whereclause = 'WHERE '+'\nAND '.join(make_filter(*x) for x in filters.iteritems())
print whereclause

打印

WHERE CHECK_NUM = 23459
AND CHECK_STATUS LIKE 'C%'
AND USER_ID = '123456'

答案 9 :(得分:0)

另一种方法是枚举您的字典并将当前迭代与最终迭代进行比较。在我看来,它更易于查看和理解:

for n, (key, value) in enumerate(yourDict.items()):
    if yourDict[n] == yourDict[-1]:
        print('Found the last iteration!:', n)

或者一旦迭代完成,您就可以做一些事情:

for key, value in yourDict.items():
    pass
else:
    print('Finished iterating over `yourDict`')

答案 10 :(得分:-2)

没有。当使用迭代器时,你对位置一无所知 - 实际上,迭代器可能是无限的。

除此之外,词典未订购。所以如果你需要它,例如要在元素之间插入逗号,应该对项目进行排序,对它们进行排序,然后迭代(key, value)元组列表。迭代此列表时,您可以轻松计算迭代次数,从而知道何时有最后一个元素。