its*_*eva 15 python sorting dictionary list
关于排序字典已经有很多问题,但我无法找到问题的正确答案.
我有字典v:
v = {3:4.0, 1:-2.0, 10:3.5, 0:1.0}
Run Code Online (Sandbox Code Playgroud)
我们必须将字典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]
Run Code Online (Sandbox Code Playgroud)
我试过使用这段代码:
def lijst(x):
return sorted(x.items(), key=lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)
这是我收到的清单:
lijst(v) = [(1, -2.0), (0, 1.0), (10, 3.5), (3, 4.0)]
Run Code Online (Sandbox Code Playgroud)
有谁知道如何将其转换为按键顺序排序的值列表,缺失值填充为零?
MSe*_*ert 11
只是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]
Run Code Online (Sandbox Code Playgroud)
如果我误解了你的原始请求并且字典表示"稀疏矢量"(其中键是索引),你可以简单地填充仅包含零的列表:
>>> 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]
Run Code Online (Sandbox Code Playgroud)
或者,如果你有NumPy,你也可以避免使用for-loop:
>>> 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])
Run Code Online (Sandbox Code Playgroud)
最后一种方法依赖于这样一个事实:即使顺序是keys和values任意的,它们只要没有修改字典就直接对应:
键和值以任意顺序迭代,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史.如果迭代键,值和项视图而没有对字典的干预修改,则项的顺序将直接对应.
您可以尝试使用这个chain来自itertools:
from itertools import chain
v = {3:4.0, 1:-2.0, 10:3.5, 0:1.0}
final_output = list(chain(*sorted(v.items(), key=lambda x: x[1])))
Run Code Online (Sandbox Code Playgroud)
输出:
[1, -2.0, 0, 1.0, 10, 3.5, 3, 4.0]
Run Code Online (Sandbox Code Playgroud)
连接(键,值)对的一种方法是使用sum()初始值:
>>> sum(sorted(v.items(), key=lambda x:x[1]), ())
(1, -2.0, 0, 1.0, 10, 3.5, 3, 4.0)
Run Code Online (Sandbox Code Playgroud)
这会返回一个元组.传递给list()你,如果你真的,真的需要一个清单.
PS正如@MSeifert在评论中正确指出的那样,这几乎肯定具有O(n**2)时间复杂度,而list(chain(...))可能是线性摊销.