簡體   English   中英

用一個迭代器將列表分成兩部分的Python方式

[英]Pythonic way of splitting loop over list in two parts with one iterator

我正在處理具有不規則結構的文本文件,該結構由標題和不同部分中的數據組成。 我的目的是瀏覽列表,遇到特定角色后跳至下一部分。 我在下面做了一個簡單的例子。 解決這個問題的優雅方法是什么?

lines = ['a','b','c','$', 1, 2, 3]

for line in lines:
    if line == '$':
        print("FOUND END OF HEADER")
        break
    else:
        print("Reading letters")

# Here, I start again, but I would like to continue with the actual
# state of the iterator, in order to only read the remaining elements.
for line in lines:
    print("Reading numbers")

通過使用內置函數iter在for循環外創建行迭代器,您實際上可以為兩個循環使用一個迭代器。 這樣,它將在第一個循環中部分耗盡,並在下一個循環中可重復使用。

lines = ['a','b','c','$', 1, 2, 3]

iter_lines = iter(lines) # This creates and iterator on lines

for line in iter_lines :
    if line == '$':
        print("FOUND END OF HEADER")
        break
    else:
        print("Reading letters")

for line in iter_lines:
    print("Reading numbers")

上面打印了這個結果。

Reading letters
Reading letters
Reading letters
FOUND END OF HEADER
Reading numbers
Reading numbers
Reading numbers

您可以使用enumerate來跟蹤迭代中的位置:

lines = ['a','b','c','$', 1, 2, 3]

for i, line in enumerate(lines):
    if line == '$':
        print("FOUND END OF HEADER")
        break
    else:
        print("Reading letters")

print(lines[i+1:]) #prints [1,2,3]

但是,除非您實際需要處理標題部分,否則@EdChum僅使用index的想法可能會更好。

一個更簡單的方法,也許是更多的pythonic:

lines = ['a','b','c','$', 1, 2, 3]
print([i for i in lines[lines.index('$')+1:]])
# [1, 2, 3]

如果要在$之后將每個元素讀取到不同的變量,請嘗試以下操作:

lines = ['a','b','c','$', 1, 2, 3]
a, b, c = [i for i in lines[lines.index('$')+1:]]
print(a, b, c)
# 1 2 3

或者,如果您不知道$后面有多少個元素,則可以執行以下操作:

lines = ['a','b','c','$', 1, 2, 3, 4, 5, 6]
a, *b = [i for i in lines[lines.index('$')+1:]]
print(a, *b)
# 1 2 3 4 5 6

如果分隔符不止一種,那么最通用的解決方案是構建一個微型狀態機來解析您的數據:

def state0(line):
  pass # processing function for state0

def state1(line):
  pass # processing function for state1

# and so on...

states = (state0, state1, ...)     # tuple grouping all processing functions
separators = {'$':1, '#':2, ...}   # linking separators and states
state = 0                          # initial state

for line in text:
  if line in separators:
    print('Found separator', line)
    state = separators[line]       # change state
  else:
    states[state](line)            # process line with associated function

該解決方案能夠以任意數量的重復以任意順序正確地處理任意數量的分隔符。 唯一的約束是給定的分隔符始終后面跟隨相同類型的數據,可以通過其關聯的功能對其進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM