python - 为什么列表结果与预期不同?
问题描述
我有一个整数列表。然后我想更改列表,而不是它包含,比如说连续四个 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]]
解决方案
这很好地说明了为什么函数应该是幂等的,也就是说,在给定相同输入的情况下,函数的每次调用都应该产生相同的结果。通过将结果列表移到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]]
推荐阅读
- php - 在 Laravel 测试中调用 null 上的成员函数 save()
- java - 如何对 ActionListener 进行 jUnit 测试
- python - How to pass arguments into a command being passed into bot.get_command() in a discord bot?
- azure-devops - 天蓝色管道中的部署作业中的条件批准门
- numpy - 如何在 Python 中实现一个带有“diag”和圆圈符号(⊗)的方程
- javascript - 使用 Material UI + React 和 HOC 进行模块化时,图像未出现在屏幕上
- c# - 调用 api 控制器时获取客户端 wan ip 地址
- javascript - 无法读取未定义的 MongoDB nodejs 驱动程序的属性“集合”
- flask - 基于数组的flask表单服务端生成
- kotlin - 如何从 Kotlin 中的 .txt 文件中选择随机行