gpt4 book ai didi

python - 从排序列表创建字典

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:28 25 4
gpt4 key购买 nike

这个问题是关于嵌套字典理解的,我已经提到了 link1link2在问这个之前。
我有一个列表,其第一个元素是 None ,其余元素是排序的正数列表。

sorted_ar = [None, 10, 10, 12, 12, 12, 15, 25] 

我的要求是建立一个字典:

key_dict = {10: [3, 2], 12: [12, 3], 15: [6, 1], 25: [7, 1]}

字典的值是一个双元素列表,第一个元素是key出现的索引之和,第二个元素是出现的次数。
例如对于元素 12,索引之和 = 3+4+5 = 12,出现次数为 3。
下面的代码可以做到这一点。

 key_dict = {k:[0,0] for k in sorted_ar if k!=None}
for i in range(len(sorted_ar)):
if sorted_ar[i]:
key_dict[sorted_ar[i]][0] += i
key_dict[sorted_ar[i]][1] += 1

我的要求是使用字典理解来准备 key_dict 字典。

我的尝试:

key_dict = { 
sorted_ar[i]:[ key_dict[sorted_ar[i]][0] + i,key_dict[sorted_ar[i]][0] + 1]
for i in range(1,len(sorted_ar)) if sorted_ar[i]!=None
}

但这会给出一些错误的结果

key_dict = {10: [2, 1], 12: [5, 1], 15: [6, 1], 25: [7, 1]} 

在这种情况下我应该如何编写字典理解?

最佳答案

如果您要使用排序,请查看 itertools.groupby()enumerate() function添加索引:

from itertools import groupby

filtered = ((i, v) for i, v in enumerate(sorted_ar) if v)
grouped = ((v, list(g)) for v, g in groupby(filtered, lambda iv: iv[1]))
result = {v: [sum(i for i, v in g), len(g)] for v, g in grouped}

如果您愿意,您可以将所有这些放入一个表达式中:

result = {v: [sum(i for i, v in g), len(g)] for v, g in (
(v, list(g)) for v, g in groupby((
(i, v) for i, v in enumerate(sorted_ar) if v), lambda iv: iv[1]))}

演示:

>>> from itertools import groupby
>>> sorted_ar = [None, 10, 10, 12, 12, 12, 15, 25]
>>> filtered = ((i, v) for i, v in enumerate(sorted_ar) if v)
>>> grouped = ((v, list(g)) for v, g in groupby(filtered, lambda iv: iv[1]))
>>> {v: [sum(i for i, v in g), len(g)] for v, g in grouped}
{10: [3, 2], 12: [12, 3], 15: [6, 1], 25: [7, 1]}

或作为一个长表达式:

>>> {v: [sum(i for i, v in g), len(g)] for v, g in ((v, list(g)) for v, g in groupby(((i, v) for i, v in enumerate(sorted_ar) if v), lambda iv: iv[1]))}
{10: [3, 2], 12: [12, 3], 15: [6, 1], 25: [7, 1]}

另一方面,您的字典方法不需要对输入进行排序,因此可以在 O(N) 时间内运行(排序需要 O(NlogN) 时间)。

关于python - 从排序列表创建字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48155106/

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