2016-12-28 121 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,但它比以前的版本更有效,因为在字典中查找的产品非常快。