Есть ли простой способ определить последнюю итерацию при повторении словаря с помощью iteritems()
?
Обнаружение последней итерации по словарю .iteritems() в python
Ответ 1
Это частный случай этого более широкого вопроса. Мое предложение состояло в том, чтобы создать генератор enumerate-like, который возвращает -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)
, если вы хотите обрабатывать последовательности, а также генераторы.
Ответ 2
Существует уродливый способ сделать это:
for i, (k, v) in enumerate(your_dict.iteritems()):
if i == len(your_dict)-1:
# do special stuff here
Но вам стоит подумать, нужно ли вам это. Я почти уверен, что есть другой способ.
Ответ 3
it = spam_dict.iteritems()
try:
eggs1 = it.next()
while True:
eggs2 = it.next()
do_something(eggs1)
eggs1 = eggs2
except StopIteration:
do_final(eggs1)
Быстро и довольно грязно. Решает ли ваша проблема?
Ответ 4
как утверждают другие, словари не имеют определенного порядка, поэтому трудно представить, зачем вам это нужно, но здесь это
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
Ответ 5
Недавно у меня была эта проблема, я подумал, что это самое элегантное решение, потому что это позволило вам написать 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(',')
Ответ 6
Я знаю это поздно, но вот как я решил эту проблему:
dictItemCount = len(dict)
dictPosition = 1
for key,value in dict
if(dictPosition = dictItemCount):
print 'last item in dictionary'
dictPosition += 1
Ответ 7
Подход, который имеет наибольший смысл, заключается в том, чтобы обернуть цикл в некотором вызове, который содержит крюк, чтобы впоследствии вызвать функцию после итерации.
Это может быть реализовано как менеджер контекста и вызвано с помощью инструкции "с", или для более старых версий Python вы можете использовать старую конструкцию "try:"... "finally:". Он также может быть обернут в класс, в котором итерация словаря отправляется самостоятельно (метод "private"), а код приложения следует в общедоступном методе. (Понимание того, что расширение между публичным и частным - это вопрос намерения и документации, а не принудительный Python).
Ответ 8
Последний элемент в цикле for зависает вокруг цикла for:
for current_item in my_dict:
do_something(current_item)
try:
do_last(current_item)
except NameError:
print "my_dict was empty"
Даже если имя "current_item" используется до цикла for, попытка выполнить цикл над пустым dict, похоже, имеет эффект удаления current_item, поэтому NameError
Ответ 9
Вы указали в вышеприведенном комментарии, что вам нужно это, чтобы построить предложение WHERE инструкции SQL SELECT. Возможно, это поможет:
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'
Ответ 10
Нет. При использовании итератора вы ничего не знаете о позиции - фактически, итератор может быть бесконечным.
Кроме того, словарь не упорядочен. Поэтому, если вам это нужно, например. чтобы вставить запятые между элементами, которые вы должны взять, сортировать их и их перебирать по списку кортежей (key, value)
. И при повторении этого списка вы можете легко подсчитать количество итераций и, следовательно, знать, когда у вас есть последний элемент.