Обнаружение последней итерации по dictionary.iteritems () в Python - PullRequest
13 голосов
/ 23 мая 2011

Есть ли простой способ обнаружить последнюю итерацию при выполнении итераций по словарю, используя iteritems()?

Ответы [ 11 ]

11 голосов
/ 23 мая 2011

Есть ужасный способ сделать это:

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

Но вы должны подумать, нужно ли вам это. Я почти уверен, что есть другой путь.

2 голосов
/ 23 мая 2011
it = spam_dict.iteritems()
try:
    eggs1 = it.next()
    while True:
        eggs2 = it.next()
        do_something(eggs1)
        eggs1 = eggs2
except StopIteration:
    do_final(eggs1)

Быстро и довольно грязно.Это решает вашу проблему?

1 голос
/ 12 февраля 2013

Я знаю это поздно, но вот как я решил эту проблему:

dictItemCount = len(dict)
dictPosition = 1
for key,value in dict
    if(dictPosition = dictItemCount):
        print 'last item in dictionary'
    dictPosition += 1
1 голос
/ 23 мая 2011

Это особый случай этого более широкого вопроса . Мое предложение состояло в том, чтобы создать генератор, похожий на перечисление , который возвращает -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), если хотите, чтобы он обрабатывал последовательности и генераторы.

1 голос
/ 23 мая 2011

У меня недавно была эта проблема, я думал, что это было самое элегантное решение, потому что оно позволило вам написать 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(',')
1 голос
/ 23 мая 2011

, как утверждают другие, словари не имеют определенного порядка, поэтому трудно представить, зачем вам это нужно, но здесь это

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
0 голосов
/ 21 февраля 2019

Другой подход состоит в том, чтобы перечислить ваш диктант и сравнить текущую итерацию с последней.На мой взгляд, его легче понять и понять:

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`')
0 голосов
/ 23 мая 2011

В приведенном выше комментарии вы заявили, что это необходимо для создания предложения 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'
0 голосов
/ 23 мая 2011

Последний элемент в цикле 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

0 голосов
/ 23 мая 2011

Подход, который имеет больше всего смысла, заключается в том, чтобы заключить цикл в некоторый вызов, который содержит ловушку для вызова вашей функции после итерации впоследствии.

Это может быть реализовано в качестве диспетчера контекста и вызываться с помощью оператора 'with' или, для более старых версий Python, вы можете использовать старую конструкцию 'try:' ... 'finally:'. Он также может быть заключен в класс, в котором итерация словаря отправляется самостоятельно («закрытый» метод), а код приложения следует за этим в общедоступном методе. (Понимание того, что различие между публичным и частным является вопросом намерения и документации, а не соблюдением Python).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...