首页 > 解决方案 > 为什么列表结果与预期不同?

问题描述

我有一个整数列表。然后我想更改列表,而不是它包含,比如说连续四个 1:s,它应该说[[4, 1]]. 所以我为此做了一个函数,但我得到了一个意想不到的结果。

这是功能

compressed3 = []

def repeat_comp(data):
    rep = 1

    for i, item in enumerate(data):
        if i < len(data) - 1:
            if item == data[i + 1]:
                rep += 1

            else:
                compressed3.append([rep, data[i - 1]])
                rep = 1

        else:
            if item == data[i - 1]:
                rep += 1

            else:
                compressed3.append([rep, data[i - 1]])
                rep = 1

repeat_comp(compressed2)

这是compressed2清单

[0,
 1,
 2,
 3,
 1,
 1,
 1,
 1,
 4]

这是与预期结果相比的函数结果

# output of function
[[1, 2832], # why this? (this number is one less than the lenght of another list that has nothing with this list to do)
 [1, 0],
 [1, 1],
 [1, 2],
# excluded value here
 [4, 1],
 [1, 1], # why this?
 [1, 4]]

# expected result
[[1, 0],
 [1, 1],
 [1, 2],
 [1, 3],
 [4, 1],
 [1, 4]]

标签: pythonpython-3.xlistfunctioncompression

解决方案


这很好地说明了为什么函数应该是幂等的,也就是说,在给定相同输入的情况下,函数的每次调用都应该产生相同的结果。通过将结果列表移到compressed3函数之外,调用者需要确定哪些调用会改变这个全局变量;几乎不可避免地会出现令人困惑的结果。

我将使用以下方法编写函数itertools.groupby

from itertools import groupby

def compress_runs(lst):
    return [[len(list(v)), k] for k, v in groupby(lst)]

if __name__ == "__main__":
    print(compress_runs([1, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6])) 
    # => [[3, 1], [2, 2], [2, 3], [1, 4], [2, 5], [1, 6]]

推荐阅读