Python按ID排序列表时触发IndexError: list index out of range问题
问题:按ID排序列表时触发IndexError
尝试将成员列表按id字段排序存入新列表,但Python抛出IndexError: list index out of range错误,无法理解问题所在,认为对应索引位置存在值。
代码示例
members = [ {'id': 1, 'firstname': 'johnny', 'lastname': 'doe' }, {'id': 3, 'firstname': 'sky', 'lastname': 'smith' }, {'id': 4, 'firstname': 'mary', 'lastname': 'johnes' }, {'id': 2, 'firstname': 'frank', 'lastname': 'sanchez'} ] NewMembers = [] i = 0 ids = 1 while len(NewMembers) != len(members): if ids == members[i]['id']: NewMembers.append(members[i]) ids += 1 else: i += 1 print(NewMembers)
报错信息
line 8, in <module> if ids == members[i]['id']: ~~~~~~~~^^^ IndexError: list index out of range
错误原因
你的逻辑是逐个查找id等于ids的元素,找到后ids加1,但没有在每次查找新的id时重置索引i。比如:
- 找到
id=1后,ids变为2,i停在0; - 接下来找
id=2,i从0开始递增,直到i=3时匹配到目标元素,此时i变为3; - 继续找
id=3,此时i从3开始递增到4,而members的最大索引是3(列表共4个元素),访问members[4]直接触发索引越界。
解决方法
方法1:用Python内置sorted函数(推荐)
这是最简洁高效的方式,直接指定排序键为id:
members = [ {'id': 1, 'firstname': 'johnny', 'lastname': 'doe' }, {'id': 3, 'firstname': 'sky', 'lastname': 'smith' }, {'id': 4, 'firstname': 'mary', 'lastname': 'johnes' }, {'id': 2, 'firstname': 'frank', 'lastname': 'sanchez'} ] NewMembers = sorted(members, key=lambda x: x['id']) print(NewMembers)
方法2:修复原逻辑
如果要自己实现查找逻辑,每次查找新的id时需要重置索引i为0:
members = [ {'id': 1, 'firstname': 'johnny', 'lastname': 'doe' }, {'id': 3, 'firstname': 'sky', 'lastname': 'smith' }, {'id': 4, 'firstname': 'mary', 'lastname': 'johnes' }, {'id': 2, 'firstname': 'frank', 'lastname': 'sanchez'} ] NewMembers = [] ids = 1 while len(NewMembers) != len(members): i = 0 # 每次查找新id时重置索引 while i < len(members): if ids == members[i]['id']: NewMembers.append(members[i]) ids += 1 break i += 1 print(NewMembers)
内容的提问来源于stack exchange,提问作者Johnny garcia
相关产品推荐
相关产品推荐

