将字典排序到列表中

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)

最后一种方法依赖于这样一个事实:即使顺序是keysvalues任意的,它们只要没有修改字典就直接对应:

键和值以任意顺序迭代,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史.如果迭代键,值和项视图而没有对字典的干预修改,则项的顺序将直接对应.

来源4.10.1.字典视图对象


Aja*_*234 6

您可以尝试使用这个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)


NPE*_*NPE 5

连接(键,值)对的一种方法是使用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(...))可能是线性摊销.