从排序列表创建字典
Dictionary creation from sorted list
这个问题是关于嵌套字典理解的,我在问这个问题之前已经参考了link1 and link2。
我有一个列表,其第一个元素是 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]}
字典的值是一个双元素列表,第一个元素是键出现次数的索引总和,第二个是出现次数。
例如对于元素 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]}
这种情况下字典理解应该怎么写?
你可以试试这个:
sorted_ar = [None, 10, 10, 12, 12, 12, 15, 25]
new_data = {i:[sum(c for c, b in enumerate(sorted_ar) if b == i), sorted_ar.count(i)] for i in sorted_ar if i}
输出:
{25: [7, 1], 10: [3, 2], 12: [12, 3], 15: [6, 1]}
如果您要使用排序,请查看itertools.groupby()
and the 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) 时间)。
好的,我找到了一种方法来实现我的行为,不知道为什么,但诀窍是字典更新需要在理解之外发生。
def my_summer(i,num,key_dict):
key_dict[num][0] = key_dict[num][0]+i
return key_dict[num][0]
def my_counter(num,key_dict):
key_dict[num][1] +=1
return key_dict[num][1]
sorted_ar = [None, 10, 10, 12, 12, 12, 15, 25]
key_dict = {k:[0,0] for k in sorted_ar if k!=None}
key_dict = {sorted_ar[i]:[my_summer(i,sorted_ar[i],key_dict),my_counter(sorted_ar[i],key_dict)] for i in range(1,len(sorted_ar))}
输出:{10: [3, 2], 12: [12, 3], 15: [6, 1], 25: [7, 1]}
您可以尝试这样的操作:
sorted_ar = [None,10, 10, 12, 12, 12, 15, 25]
track={}
for i,j in enumerate(sorted_ar):
if j not in track:
track[j]=[(i,1)]
else:
track[j].append((i,1))
final_={}
for i,j in track.items():
if i not in final_:
final_[i]=(sum(list(map(lambda x:x[0],j))),sum(list(map(lambda x:x[1],j))))
print(final_)
输出:
{None: (0, 1), 10: (3, 2), 15: (6, 1), 12: (12, 3), 25: (7, 1)}
这个问题是关于嵌套字典理解的,我在问这个问题之前已经参考了link1 and link2。
我有一个列表,其第一个元素是 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]}
字典的值是一个双元素列表,第一个元素是键出现次数的索引总和,第二个是出现次数。
例如对于元素 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]}
这种情况下字典理解应该怎么写?
你可以试试这个:
sorted_ar = [None, 10, 10, 12, 12, 12, 15, 25]
new_data = {i:[sum(c for c, b in enumerate(sorted_ar) if b == i), sorted_ar.count(i)] for i in sorted_ar if i}
输出:
{25: [7, 1], 10: [3, 2], 12: [12, 3], 15: [6, 1]}
如果您要使用排序,请查看itertools.groupby()
and the 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) 时间)。
好的,我找到了一种方法来实现我的行为,不知道为什么,但诀窍是字典更新需要在理解之外发生。
def my_summer(i,num,key_dict):
key_dict[num][0] = key_dict[num][0]+i
return key_dict[num][0]
def my_counter(num,key_dict):
key_dict[num][1] +=1
return key_dict[num][1]
sorted_ar = [None, 10, 10, 12, 12, 12, 15, 25]
key_dict = {k:[0,0] for k in sorted_ar if k!=None}
key_dict = {sorted_ar[i]:[my_summer(i,sorted_ar[i],key_dict),my_counter(sorted_ar[i],key_dict)] for i in range(1,len(sorted_ar))}
输出:{10: [3, 2], 12: [12, 3], 15: [6, 1], 25: [7, 1]}
您可以尝试这样的操作:
sorted_ar = [None,10, 10, 12, 12, 12, 15, 25]
track={}
for i,j in enumerate(sorted_ar):
if j not in track:
track[j]=[(i,1)]
else:
track[j].append((i,1))
final_={}
for i,j in track.items():
if i not in final_:
final_[i]=(sum(list(map(lambda x:x[0],j))),sum(list(map(lambda x:x[1],j))))
print(final_)
输出:
{None: (0, 1), 10: (3, 2), 15: (6, 1), 12: (12, 3), 25: (7, 1)}