2017-04-13 100 views
2

讓的說我們已經給這個小程序:如何遍歷Python中指定範圍的列表中的參數?

a = [[70, 19, 54, 7, 63], 
    [78, 72, 93, 78, 33], 
    [83, 55, 57, 9, 22], 
    [95, 64, 90, 91, 54]] 

for x, y, *z in a: 
    print("x = {}, y = {}, z = {}".format(x, y, z)) 

這將會給我的第一個元素在列表a

x = 70, y = 19, z = [54, 7, 63] 

但我要的是定義,有多少元素定義的變量應該有,例如這樣的事情:

for x, y[:2], z[:2] in a: 
    print("x = {}, y = {}, z = {}".format(x, y, z)) 

其確實,這不會在python中工作。 (我試過了)

這將是很好,如果有一種方式來做這樣的事情在Python中。

我知道我可以做這樣的事情:

b = list(zip(*a)) 

c1 = b[0] 
c2 = list(zip(*b[1:3])) 
c3 = list(zip(*b[3:5])) 

for x, y, z in zip(c1, c2, c3): 
    print("x = {}, y = {}, z = {}".format(x, y, z)) 

這將使我在a第一個參數:

x = 70, y = (19, 54), z = (7, 63) 

但對於一個巨大的名單a這是現在這樣很高效。

+3

那麼爲什麼不直接從循環中的切片*分配*?對於a,x,y,z =值[0],值[1:3],值[3:5]'中的值。 –

+0

或更好,仍然使用更詳細的數據結構,它不會將所有值放入一個長列表中。 –

+0

這會工作,但我認爲它可以直接在for循環中執行。 – PiMathCLanguage

回答

2

分配中的*運算符旨在用於捕獲列表的「extrenous」元素。它不打算成爲模式匹配語言。

的選項有:

  • 產生更多的結構化數據。如果您的輸入已經被分組到元組或其他對象中,您可以更容易地在循環中處理它。

  • 提取在循環中的子列表,然後分配:

    for values in a: 
        x, y, z = values[0], values[1:3], values[3:5] 
    
  • 使用發電機表達式重新包裝結構;上循環發電機表達發生在平行於遍歷所有發電機:

    a_repacked = ((v[0], v[1:3], v[3:5]) for v in a) 
    for x, y, z in a_repacked: 
        # ... 
    

    可以內嵌發電機表達到for循環語句,但可讀性,我建議你堅持一個獨立的變量。