将列表拆分为子列表
定义一个函数
split_list
,这个函数需要接收一个数字列表和一个数字a
,然后把这个列表分成两个子列表:list1
包含小于或等于a
的数字,另一个列表list2
包含大于a
的数字。最后,list1
和list2
需要作为一个元组返回。
我的代码:
def split_list(lst, a):
list1 = []
list2 = []
for i in lst:
if i <= a:
list1.append(i)
lst.remove(i)
elif i > a:
list2.append(i)
lst.remove(i)
return (list1, list2)
测试代码:
split_list([1, 10, 4, 9, 7, 2, 5, 8, 3, 4, 9, 6, 2], 5)
应该返回: ([1, 4, 2, 5, 3, 4, 2], [10, 9, 7, 8, 9, 6])
但我得到的是 ([1, 4, 5, 3, 2], [7, 9])
。我的代码哪里出错了?
4 个回答
0
def split_list(lst, a):
list1 = []
list2 = []
for i in lst:
if i <= a:
list1.append(i)
elif i > a:
list2.append(i)
return (list1, list2)
在你遍历lst这个列表的时候,其实不需要把里面的项目删除。
0
在遍历一个 list
的时候去修改它,结果通常不会好。我的建议是这样做:
for i in lst[:]: # Make a shallow copy.
#stuff
这样我们就可以在不改变原始列表的情况下进行遍历,因此可以安全地编辑原始列表。
或者干脆不去修改这个列表,这样就可以去掉所有 lst.remove(i)
的用法,这样也能解决问题。
1
为了避免跳过某些元素,你可以选择从后往前遍历列表,并在遍历的过程中删除元素。下面是一个示例,使用列表的索引,而不是“for listitem in list”这种写法。
def split_list(lst, a):
list1 = []
list2 = []
for x in range(len(lst)-1,-1,-1):
if lst[x] <= a:
list1.append(lst[x])
del lst[x]
elif lst[x] > a:
list2.append(lst[x])
del lst[x]
return (list1, list2)
print split_list([1, 10, 4, 9, 7, 2, 5, 8, 3, 4, 9, 6, 2], 5)
# outputs ([2, 4, 3, 5, 2, 4, 1], [6, 9, 8, 7, 9, 10])
2
正如Martijn所说,你在遍历列表lst
的同时又试图从中删除元素,这样会导致问题。
其实你并不需要从lst
中删除元素,所以可以把那些删除的代码去掉。
或者,你可以先复制一份lst
,然后在原来的lst
上进行删除操作。要做到这一点,只需把你的for循环改成:
for i in lst[:]
这样做会复制出一个完整的lst
的切片,方便你进行遍历。