将列表拆分为子列表

时间:2014-04-10 17:32:14

标签: python split

  

定义一个函数split_list,其中包含一个数字列表和一个数字a,并将其拆分为两个子列表:list1包含小于或等于{{1}的数字},以及包含大于a的数字的另一个列表a。必须将list2list1作为元组的元素返回。

我的代码:

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])。我的代码怎么了?

4 个答案:

答案 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])