Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中通过元组比较项目_Python_Tuples - Fatal编程技术网

在Python中通过元组比较项目

在Python中通过元组比较项目,python,tuples,Python,Tuples,当我应该定义一个函数,如果元组的第一个元素与函数的参数匹配,则该函数返回元组的第二个元素时,会给我一个赋值 具体来说,假设我有一个学生注册号列表: 详情=((“S12345”、“John”)、(“S23456”、“Max”)、(“S34567”、“Mary”)) 我定义了一个函数,它应该接受reg_num的参数,比如“S12345”,并返回学生的名字,在本例中是“John”。如果号码根本不匹配,我需要将“未找到”打印为消息。本质上,我知道我需要对较大的元组进行排序,比较每个较小元组的第一个元素[

当我应该定义一个函数,如果元组的第一个元素与函数的参数匹配,则该函数返回元组的第二个元素时,会给我一个赋值

具体来说,假设我有一个学生注册号列表:
详情=((“S12345”、“John”)、(“S23456”、“Max”)、(“S34567”、“Mary”))

我定义了一个函数,它应该接受
reg_num
的参数,比如
“S12345”
,并返回学生的名字,在本例中是
“John”
。如果号码根本不匹配,我需要将“未找到”打印为消息。本质上,我知道我需要对较大的元组进行排序,比较每个较小元组的第一个元素
[0]
,然后返回每个较小元组的
[1]
条目。以下是我的想法:

def get_student_name(注册号,详细信息):
对于我的记录:
如果reg_num==详情[::1][0]:
申报详情[i][1]
其他:
打印(“未找到”)

我知道我错了,但我不知道为什么。我不太熟悉如何对元组进行排序。有人能提供一些建议吗,特别是在语法方面?多谢各位

当您在细节中为i编写
时,在每次迭代中
i
是集合的一项,而不是索引。因此,您无法执行
详细信息[i]
(并且没有必要-因为您已经拥有该项目)。此外,请删除else语句,以避免打印每个不符合条件的项目:

def get_student_name(reg_num, particulars):
    for i in particulars:
        if reg_num == i[0]:
            return i[1]
    print("Not found")
如果您想使用索引进行迭代,您可以这样做(但不太好):


另一种方法,用于帮助学习操作python数据结构的新技巧:

您可以将元组转换为元组:

particulars = (("S12345", "John"), ("S23456", "Max"), ("S34567", "Mary"))
进入
词典

>>> pdict = dict(particulars)
>>> pdict
{'S12345': 'John', 'S23456': 'Max', 'S34567': 'Mary'}
通过提供
,可以查找

>>> r = 'S23456'
>>> dict(pdict)[r]
'Max'
职能:

def get_student_name(reg, s_data):
    try:
        return dict(s_data)[reg]
    except:
        return "Not Found"

使用
try。。。如果
reg
首先不在元组中,except
将捕获错误并返回
notfound
。它还将捕获提供的元组不是一系列对的情况,因此无法按预期的方式进行转换

您可以阅读有关异常的更多信息:并了解如何对不同类型的错误做出不同的响应。

for
python中的循环 通过一种修复代码的方法和对for循环的快速解释

这里有五个循环,它们或多或少做着相同的事情;我邀请你尝试一下

详情=((“S12345”、“John”)、(“S23456”、“Max”)、(“S34567”、“Mary”))
关于t的详情:
打印(“{}{}”。格式(t[0],t[1]))
对于范围内的i(len(详情)):
打印(“{}:{}{}”。格式(i,详情[i][0],详情[i][1]))
关于i,t(详情):
打印(“{}:{}{}”。格式(i,t[0],t[1]))
对于注册值,详细信息中的学生姓名:
打印(“{}{}”。格式(注册表值、学生姓名))
对于枚举(详情)中的i(注册值、学生姓名):
打印(“{}:{}{}”。格式(i,注册表值,学生姓名))
使用字典而不是列表 最重要的是,我想补充一点,使用未排序的列表来存储学生记录并不是最有效的方法

如果您对列表进行排序并按排序顺序进行维护,则可以使用搜索
reg_num
比一次浏览一项列表快得多。想一想:当你需要在字典里查找一个单词时,你是否会一个接一个地阅读所有单词,从“啊”,“惊讶”,“惊讶”,“放弃”等等开始。?不首先,你在中间的某个地方打开字典;你把那页上的字和你的字比较一下;然后再打开另一页;再比较一下;每次你这样做,候选页面的数量就会大大减少,因此你可以在很短的时间内从300000个其他单词中找到你的单词

您可以使用另一种数据结构,例如a或a,而不是使用带有二进制搜索的排序列表

但是,等等!Python已经很容易做到了

python中有一个称为字典的数据结构。此结构完全适用于大多数情况,其中您有与值关联的键。这里的键是注册号,值是学生姓名

您可以直接定义字典:

detacts={'S12345':'John','S23456':'Max','S34567':'Mary'}
或者,您可以将元组列表转换为字典:

详情=((“S12345”、“John”)、(“S23456”、“Max”)、(“S34567”、“Mary”))
详细信息=详细信息
然后,您可以检查字典中是否有注册号,并在
中输入关键字
;您可以使用方括号或使用方法
get
返回学生姓名:

>>详情={'S12345':'John','S23456':'Max','S34567':'Mary'}
>>>“S23456”的详细信息
真的
>>>“S98765”的详细信息
假的
>>>
>>>详情['S23456']
“马克斯”
>>>详情。获取('S23456')
“马克斯”
>>>获取详情('S23456','notfound')
“马克斯”
>>>
>>>详情['S98765']
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
键错误:“S98765”
>>>详情。获取('S98765')
没有一个
>>>获取详情('S98765','notfound')
“未找到”

明白了!非常感谢你,但我有一些快速的问题,希望你的解释!在这种情况下,我怎么可能已经是一个元组了?是因为它只是直接在较大的元组中接受对象的类型吗?[::1]是不必要的,因为“for”已经意味着python将已经对下一个条目进行排序了吗?@a9302c-python中的元组是ITerable(也就是说,您可以使用for循环对它们进行迭代)。循环已经为您逐个返回项目。因为这个iterable的项本身就是元组,所以您可以
def get_student_name(reg, s_data):
    try:
        return dict(s_data)[reg]
    except:
        return "Not Found"