定义一个函数
split_list
,其中包含一个数字列表和一个数字a
,并将其拆分为两个子列表:list1
包含小于或等于{{1}的数字},以及包含大于a的数字的另一个列表a
。必须将list2
和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])
。我的代码怎么了?
答案 0 :(得分:2)
正如Martijn所评论的那样,您通过尝试迭代并同时从中删除列表来lst
。
您不需要从lst
删除,因此您可以删除这些行。
或者,您可以迭代lst
的副本,同时从原始lst
中删除。
为此,只需将for循环更改为:
for i in lst[:]
这将复制与整个lst
对应的切片,供您迭代。
答案 1 :(得分:0)
在迭代它时修改list
总是会很糟糕。我会改为:
for i in lst[:]: # Make a shallow copy.
#stuff
然后我们迭代该未修改的副本,因此基于此我们可以安全地编辑原始文件。
或者根本不要修改列表,这意味着您可以删除lst.remove(i)
的所有用途,这也可以解决问题。
答案 2 :(得分: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列表中删除项目。
答案 3 :(得分:0)
为避免跳过元素,您可以选择在向后循环删除列表。这是一个使用列表索引而不是&#34;列表中列表项目的示例&#34;构造
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])