gpt4 book ai didi

python - 如何查找列表中每个长度的连续值序列的数量?

转载 作者:行者123 更新时间:2023-12-01 00:36:38 26 4
gpt4 key购买 nike

问题

给定一个由 1 和 0 组成的序列(列表或 numpy 数组),如何找到连续值子序列的数量?我想返回一个类似 JSON 的字典字典。

示例

[0, 0, 1, 1, 0, 1, 1, 1, 0, 0] 将返回

{
0: {
1: 1,
2: 2
},
1: {
2: 1,
3: 1
}

}

尝试过

这是我目前为止拥有的功能

def foo(arr):
prev = arr[0]
count = 1

lengths = dict.fromkeys(arr, {})

for i in arr[1:]:
if i == prev:
count += 1
else:
if count in lengths[prev].keys():
lengths[prev][count] += 1
else:
lengths[prev][count] = 1

prev = i
count = 1

return lengths

即使 0 和 1 在列表中的出现不同,它也会输出相同的字典。而且这个函数没有获取最后一个值。我该如何改进和修复它?另外,如果我的数据位于 numpy 数组中,numpy 是否提供更快的方法来解决我的问题? (也许使用np.where(...))

最佳答案

您遇到了旧复制错误。让我们检测您的函数来显示问题,添加一行来检查列表中每个字典的对象 ID:

lengths = dict.fromkeys(arr, {})
print(id(lengths[0]), id(lengths[1]))

输出:

140130522360928 140130522360928
{0: {2: 2, 1: 1, 3: 1}, 1: {2: 2, 1: 1, 3: 1}}

问题是您为每个键指定了相同字典作为初始值。当您更新其中任何一个时,您将更改它们所引用的一个对象。

将其替换为显式循环(而不是可变函数参数),这将为每个字典条目创建一个新对象:

for key in lengths:
lengths[key] = {}
print(id(lengths[0]), id(lengths[1]))

输出:

139872021765576 139872021765288
{0: {2: 1, 1: 1}, 1: {2: 1, 3: 1}}

现在您有了单独的对象。

如果你想要一句台词,请使用字典理解:

lengths = {key: {} for key in lengths}

关于python - 如何查找列表中每个长度的连续值序列的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57699790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com