是否有一种简单的方法可以在使用iteritems()
迭代字典时检测最后一次迭代?
答案 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)
元组列表。迭代此列表时,您可以轻松计算迭代次数,从而知道何时有最后一个元素。