关于分类词典已经有很多问题了,但我找不到正确的答案。
我有字典五:
v = {3:4.0, 1:-2.0, 10:3.5, 0:1.0}
我们必须把字典V变成一个排序表。
lijst(v) = [1.0, -2.0, 0.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.5]
我尝试使用此代码:
def lijst(x):
return sorted(x.items(), key=lambda x: x[1])
这是我收到的列表:
lijst(v) = [(1, -2.0), (0, 1.0), (10, 3.5), (3, 4.0)]
是否有人知道如何将其转换为按键顺序排序的值列表,其中缺少的值用零填充?
最佳答案
只需使用itertools.chain.from_iterable
将结果变平(元组列表):
>>> import itertools
>>> list(itertools.chain.from_iterable([(1, -2.0), (0, 1.0), (10, 3.5), (3, 4.0)]))
[1, -2.0, 0, 1.0, 10, 3.5, 3, 4.0]
如果我误解了您的原始请求,并且字典表示一个“稀疏向量”(其中键是索引),您可以简单地填充一个仅包含零的列表:
>>> res = [0.0]*(max(v)+1) # create a dummy list containing only zeros
>>> for idx, val in v.items(): # populate the requested indices
... res[idx] = val
>>> res
[1.0, -2.0, 0.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.5]
或者,如果您有麻木感,也可以避免出现循环:
>>> import numpy as np
>>> arr = np.zeros(max(v)+1)
>>> arr[list(v.keys())] = list(v.values())
>>> arr
array([ 1. , -2. , 0. , 4. , 0. , 0. , 0. , 0. , 0. , 0. , 3.5])
最后一种方法依赖于这样一个事实,即即使
for
和keys
的顺序是任意的,只要字典没有修改,它们仍然直接对应:键和值以非随机的任意顺序迭代,不同于Python实现,并且取决于字典的插入和删除历史。如果键、值和项视图被迭代而没有对字典进行中间的修改,则项的顺序将直接对应。
来源4.10.1. Dictionary view objects
关于python - 将字典排序到列表中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45468480/