Обнаружение последней итерации по словарю .iteritems() в python

Есть ли простой способ определить последнюю итерацию при повторении словаря с помощью iteritems()?

Ответ 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). И при повторении этого списка вы можете легко подсчитать количество итераций и, следовательно, знать, когда у вас есть последний элемент.