将列表拆分为子列表

0 投票
4 回答
1040 浏览
提问于 2025-04-18 02:14

定义一个函数 split_list,这个函数需要接收一个数字列表和一个数字 a,然后把这个列表分成两个子列表:list1 包含小于或等于 a 的数字,另一个列表 list2 包含大于 a 的数字。最后,list1list2 需要作为一个元组返回。

我的代码:

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的切片,方便你进行遍历。

撰写回答