эффективно итерации вложенных списков python

Я работаю над проектом мониторинга сетевого трафика в Python. Не то, что знакомо с Python, поэтому я ищу помощь здесь.

Короче говоря, я проверяю как входящие, так и исходящие трафик, я написал это так:

for iter in ('in','out'): netdata = myhttp() print data 

netdata – это список, состоящий из вложенных списков, его формат выглядит так:

 [ [t1,f1], [t2,f2], ...] 

Здесь t представляет момент, а f – поток. Однако я просто хочу сохранить эти f в этот момент как для входа, так и для выхода, интересно, какой способ получить эффективный код.

После некоторого поиска, я думаю, мне нужно использовать создать список трафика (2 элемента), а затем использовать zip-функцию для одновременного итерации обоих списков, но мне сложно написать правильный. Поскольку мои netdata – очень длинный список, эффективность также очень важна.

Если есть что-то запутанное, дайте мне знать, я попытаюсь разъяснить. Спасибо за помощь

  • Python numpy: создать 2d массив значений на основе координат
  • Обновлено до OSX 10.11 El Capitan, теперь не может использовать MySQL с Python / Django
  • AttributeError: объект 'module' не имеет атрибута 'commit_on_success'
  • Python: разумно ли использовать None в качестве словарного ключа?
  • Временное напоминание электронной почты в python
  • Помощь с ошибкой pyHook
  • API Twitter с urllib2 в python
  • Какова наиболее эффективная структура данных графа в Python?
  • 3 Solutions collect form web for “эффективно итерации вложенных списков python”

    Помимо незначительных исправлений в вашем коде (вопросы, поднятые @Zero Piraeus), на ваш вопрос, вероятно, ответили здесь . Возможный код для перемещения списка списков в N-градусе (дерево):

     def traverse(item): try: for i in iter(item): for j in traverse(i): yield j except TypeError: yield item 

    Пример:

     l = [1, [2, 3], [4, 5, [[6, 7], 8], 9], 10] print [i for i in traverse(l)] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

    Ключ, чтобы заставить его работать, – это рекурсия, и ключ, чтобы заставить его работать эффективно, использует генератор (ключевое слово yield дает подсказку). Генератор будет перебирать список списков, возвращая вам элемент по элементам, без необходимости копировать данные или создавать целый новый список (если только вы не используете весь генератор, назначающий результат списку, как в моем примере)

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

    Код, который вы показали, не имеет большого смысла. Вот что он делает:

    • Итерации через последовательность 'in', 'out' , назначая каждую из этих двух строк в свою очередь переменной iter (маскируя встроенную функцию iter() в процессе) на двух своих проходах через цикл.

    • Полностью игнорируйте значение iter внутри цикла.

    • Назначьте результат myhttp() переменной netdata на каждом проходе через цикл.

    • Полностью игнорируйте значение netdata и вместо этого пытайтесь распечатать неопределенные data переменной на каждом проходе через цикл.

    Возможно, учитывая, что вложенный список вы описываете, что вы хотите что-то вроде этого:

     for t, f in myhttp(): print t print f # ... or whatever you want to do with those values. 

    Когда вы пытаетесь, другой отвечает, функция не была способна рекурсивно, поэтому я изменил ее, чтобы не перезаписывать. Он по-прежнему работает довольно быстро и может обрабатывать большие вложенные списки (по крайней мере, насколько я могу судить по моему тестированию). Это только функция Python 3.

     # Originally by Bruno Polaco def traverse(item, reverse=False): its = [item] #stack of items to-be-processed out = [] # Output (no longer generator) ite = False while len(its) > 0: it = its.pop() try: # Check if item is iterable iter(it) ite = not isinstance(it, str) except TypeError: ite = False if ite: # Do something with it for i in it: its.append(i) else: out.append(it) if not reverse: out.reverse() return out 
    Python - лучший язык программирования в мире.