2016-12-28 138 views
-2

我在遍歷由元組組成的列表時遇到了一些麻煩。在Python中迭代元組

看起來問題在於for循環中的索引。

每當我運行程序的唯一結果是:

('joao', 300, 20) 

誰能請給我這個正在發生的事情解釋一下嗎?

tuplo = [('joao', 300, 20), ('ana', 80, 15), ('patricia', 17, 90)] 
def coordenadas(tuplo, name): 
    for index in range(len(tuplo)):   
     if tuplo[index][0] == name: 
      print(tuplo[index][0:]) 
     else: 
      return None 

coordenadas(tuplo,'joao') 
coordenadas(tuplo,'ana') 
coordenadas(tuplo,'patricia') 
+1

嘗試:http://www.pythontutor.com |你期望會發生什麼? –

+2

在[[o:]'應該做的事情中,切片和字母「o」是什麼?您提供的代碼無法運行('NameError:name'o'未定義')。即使你的意思是零,那個片在這種情況下也是沒有用的。 – cdarke

回答

4

首先,我相信你的意思是在你的片使用0而不是o

print(tuplo[indice][o:]) =>print(tuplo[indice][0:])

你的問題是,你正在使用return這將退出你的函數。相反,你應該使用continue

tuplo = [('joao',300,20),('ana',80,15),('patricia',17,90)] 
def coordenadas(tuplo,nome): 
    for indice in range(len(tuplo)): 
     if tuplo[indice][0] == nome: 
      print(tuplo[indice][0:]) 
     else: 
      continue 

coordenadas(tuplo,'joao') 
coordenadas(tuplo,'ana') 
coordenadas(tuplo,'patricia') 

輸出:

('joao', 300, 20) 
('ana', 80, 15) 
('patricia', 17, 90) 

如果我寫這個功能,我會做別的事情:

首先,我不會爲tuplo使用相同的名稱內功能和外部。 其次,我會遍歷列表中,而不是將其索引的項目(這是蟒蛇迭代正確的方式)第三 ,我將優化功能,這一點:

global_tuplo = [('joao',300,20),('ana',80,15),('patricia',17,90)] 

def coordenadas(tuplo,nome): 
    for tup in tuplo: 
     if tup[0] == nome: 
      print(tup) 


coordenadas(global_tuplo, 'joao') 
coordenadas(global_tuplo, 'ana') 
coordenadas(global_tuplo, 'patricia') 
+0

如果可能我會再給你一個+1的更長解釋 – depperm

+0

謝謝你的幫助! –

+0

謝謝你的幫助! 我做了返回無,因爲那是我的老師給我的練習中指定的:/ 同樣的名字只是爲了讓跑步變得更容易......迭代也是我的老師認爲我們要迭代元組:/ –

2

卸下else和改變[o:][0]使你的代碼工作

tuplo = [('joao',300,20),('ana',80,15),('patricia',17,90)] 
def coordenadas(tuplo,nome): 
    for indice in range(len(tuplo)): 
     if tuplo[indice][0] == nome: 
      print(tuplo[indice][0]) 

coordenadas(tuplo,'joao') 
coordenadas(tuplo,'ana') 
coordenadas(tuplo,'patricia') 

如果你想要的名稱細節改變tuplo[indice][0]tuplo[indice]

0

這個代碼

else: 
    return None 

,跳出for循環的,如果if試驗沒有成功,所以如果名稱不匹配,沒有其他名字的測試列表中的第一個元組。你不需要那個!

而且,你不需要做

tuplo[index][0:] 

你可以做

tuplo[index] 

這是你的代碼的修復版本。

tuplo = [ 
    ('joao', 300, 20), 
    ('ana', 80, 15), 
    ('patricia', 17, 90), 
] 

def coordenadas(tuplo, nome): 
    for indice in range(len(tuplo)): 
     if tuplo[indice][0] == nome: 
      print(tuplo[indice]) 

coordenadas(tuplo, 'joao') 
coordenadas(tuplo, 'ana') 
coordenadas(tuplo, 'patricia') 

輸出

('joao', 300, 20) 
('ana', 80, 15) 
('patricia', 17, 90) 

順便說一句,如果你只是想找到第一個匹配的元組,你可以添加一個breakreturn語句來if塊的結尾,就像這樣:

def coordenadas(tuplo, nome): 
    for indice in range(len(tuplo)): 
     if tuplo[indice][0] == nome: 
      print(tuplo[indice]) 
      break 

但是,有更好的方法來完成這項任務。在Python,最好直接在集合中的項目進行迭代,而不是通過間接指標迭代:

def coordenadas(tuplo, nome): 
    for t in tuplo: 
     if t[0] == nome: 
      print(t) 
      break 

更有效的方式是將您的列表轉換爲一個字典,特別是如果你有很多的元組。例如:

tuplo = [ 
    ('joao', 300, 20), 
    ('ana', 80, 15), 
    ('patricia', 17, 90), 
] 

tuplo_dict = {t[0]: t for t in tuplo} 

def coordenadas(data, nome): 
    print(nome, data.get(nome)) 

coordenadas(tuplo_dict, 'joao') 
coordenadas(tuplo_dict, 'ana') 
coordenadas(tuplo_dict, 'patricia') 
coordenadas(tuplo_dict, 'tom') 

輸出

joao ('joao', 300, 20) 
ana ('ana', 80, 15) 
patricia ('patricia', 17, 90) 
tom None 

它使用多一點的RAM,但它比以前的版本更有效,因爲在字典中查找的產品非常快。