2016-11-17 2 views
-1

Меня беспокоит, если name_3 [0]> 50, добавьте его в таблицу html и если name_3 [0] < = 50, отбросьте его и итерация до следующего значения в словаре, потому что я не хочу добавлять запись ниже 50. Ниже приведена логика, о которой я думаю. Но можем ли мы перебирать следующую ценность?В то время как итерация по словарю, удаление элементов не требуется и дальнейшее перемещение в словаре (Python)

for name_1 in sorted(any_dictionary.keys()): 
    for name_2 in sorted(any_dictionary[name_1].keys()): 
     for name_3 in any_dictionary[name_1][name_2]: 
      if (name_3[0] > 50): 
        size_KB = name_3[0] 
      address=name_3[1] 
      html += """<tr> 
        <td>{}</td> 
        <td>{}</td> 
        <td>{:,}</td> 
        <td>{:,} [{}]</td> 
        <td>{}</td> 
        </tr>\n""".format(name_1, 
            name_2, 
            size_KB, 
            name_3[2], 
            name_3[3], 
            address) 
+2

Вы перебирать ключи, а не значения. Это больше похоже на: 'for key in any_dictionary' – sisanared

+0

Диктов не заказывают. Если вы удалите элемент, нет гарантии того, что произойдет. https://docs.python.org/3/library/stdtypes.html#typesmapping – Goodies

+0

http://stackoverflow.com/questions/5384914/how-to-delete-items-from-a-dictionary-while-iterating- over-it –

ответ

0

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

Возможно, добавьте эти значения, которые вы хотите сохранить, в новый словарь вместо этого?

0

В соответствии с Вашим последним комментарием:

  • Итерация по значениям в словаре
  • только назначить size_KB и работать на ней, если первая запись в значение больше, чем 50.

т.е. (вам не нужен блок else):

>>> size_KB = None 
>>> d = {'a': [40], 'b': [50], 'c': [100], 'e': [30], 'f': [200]} 
>>> for value in d.values(): 
...  if (value[0] > 50): 
...   size_KB = value[0] 
...  print 'Value is:', value 
...  print 'Size is:', size_KB 
...  
Value is: [40] 
Size is: None 
Value is: [100] 
Size is: 100 
Value is: [50] 
Size is: 100 
Value is: [30] 
Size is: 100 
Value is: [200] 
Size is: 200 
>>> 

Размер только получает присвоенный wh en value[0] больше, чем 50.

Для вашего HTML:

>>> d = {'a': [40], 'b': [50], 'c': [100], 'e': [30], 'f': [200]} 
>>> row_template = '<tr><td>%s</td></tr>' 
>>> html = '<table style="width:100%">' + '\n'.join([row_template % value[0] for value in d.values() if value[0] > 50]) + '</table>' 
>>> html 
'<table style="width:100%"><tr><td>100</td></tr>\n<tr><td>200</td></tr></table>' 
+0

@ Darsh - это вся суть итерации над значениями. Цикл перейдет к следующему элементу. Если значение [0] больше 50, оно будет выполнять тело оператора if. В противном случае он просто перейдет к следующему значению. – Bahrom

+0

Да, вы отменили печать. Он должен оставаться внутри IF, чтобы он печатал, если утверждение истинно. В противном случае цикл продолжит переход к следующему элементу. – Bahrom

+0

Я сделал это нарочно. Я хочу использовать size_KB для дальнейшего использования. За пределами оператора if – Darsh