为什么这个python代码不起作用?

时间:2017-01-21 10:07:35

标签: python loops

你能帮我解决这个问题吗?

s = [1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 2, 2, 2]

def group(s):
    lst = []
    temp_lst = []
    for i in s:
        if len(temp_lst) == 0:
            temp_lst.append(i)
            continue
        if temp_lst[0] == i:
            temp_lst.append(i)
        else:
            lst.append(temp_lst)
            del temp_lst[:]
            temp_lst.append(i)
    return lst

它返回:

[[2, 2, 2], [2, 2, 2], [2, 2, 2], [2, 2, 2]]

为什么呢?

我想要的输出是:

[[1, 1], [3, 3], [2, 2, 2, 2], [1, 1], [2, 2, 2]]

1 个答案:

答案 0 :(得分:2)

此作品:del temp_lst[:]替换temp_lst = []

s = [1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 2, 2, 2]

def group(s):
    lst = []
    temp_lst = []
    for i in s:
        if len(temp_lst) == 0:
            temp_lst.append(i)
            continue
        if temp_lst[0] == i:
            temp_lst.append(i)
        else:
            lst.append(temp_lst)
            temp_lst = []
            temp_lst.append(i)
    lst.append(temp_lst)
    return lst

print group(s)

输出:

[[1, 1], [3, 3], [2, 2, 2, 2], [1, 1], [2, 2, 2]]

del temp_lst[:]的作用是删除列表的所有条目。这里要理解的关键是您通过引用进行操作,并且需要将temp_list指向新列表,这样您就不会对刚刚放入的旧列表进行操作lst

执行temp_list = []会将旧列表(您刚刚插入lst)并将变量(您可以想到一个指针)分配给一个新的空列表,该列表与刚刚插入的列表无关列表。

正如jonrsharpe正确地指出的那样,更好的解决方案是itertools.groupby

s = [1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 2, 2, 2]
[list(l[1]) for l in itertools.groupby(s)]

输出:

[[1, 1], [3, 3], [2, 2, 2, 2], [1, 1], [2, 2, 2]]