[英]iterate python nested lists efficiently
我正在使用Python進行網絡流量監控項目。 不熟悉Python,所以我在這里尋求幫助。
簡而言之,我正在檢查流量和流量,我這樣寫:
for iter in ('in','out'):
netdata = myhttp()
print data
netdata是一個由嵌套列表組成的列表,其格式如下:
[ [t1,f1], [t2,f2], ...]
這里t
表示時刻, f
表示流量。 但是我只想在這個時刻保留這些f進行內外,我想知道如何獲得有效的代碼。
經過一些搜索,我認為我需要使用創建流量列表(2個元素),然后使用zip函數同時迭代這兩個列表,但是我很難寫出正確的列表。 由於我的netdata是一個很長的列表,效率也非常重要。
如果有任何令人困惑的事情,請告訴我,我會盡力澄清。 感謝幫助
除了代碼的小修復(@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
給出提示)。 生成器將遍歷您的列表列表,逐項返回給您,無需復制數據或創建全新列表(除非您使用整個生成器將結果分配給列表,如我的示例中所示)
使用迭代器和生成器可以理解奇怪的概念(主要是關鍵字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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.