在Python字典中对值进行排序

3

我是Python的新手,不太清楚如何使用字典。我想要用另一个字典来对其中一个字典进行排序,就像下面所示。每个顶点特征都是一个列表。

vertex_features = ['Charge', 'Time', 'TimeDelta', 'TimeSinceLastPulse']
..........
..........
a = {feature : [] for feature in vertex_features }

我想对时间特征进行排序(并获取相应的费用、时间间隔等信息),我是通过以下方式实现的:

hit_order = np.argsort(features['Time'])

然而,当我尝试时

for feature in features:
    features[feature] = features[feature][hit_order]

它报错了

TypeError: only integer scalar arrays can be converted to a scalar index

我也尝试过

for feature in features:
    features[feature] = features[feature][for i in hit_order]

但是无法获得已排序的列表。我并不确定自己在这里排序时出了什么问题,非常感谢您的帮助。


我认为您需要先将列表转换为np.array,然后再转回列表,如果您想要它成为一个列表的话。否则,我会直接从np.array开始,而不是从列表开始。 - Benjamin Rowell
2个回答

2
你遇到的问题是Python列表不支持使用方括号语法重新排序,这是Numpy数组的特性。
当你在Python列表上使用方括号时,解释器要么期望一个标量索引,要么期望某种切片。
你可以将字典返回的特征列表包装在np.array中,而不是使用列表。
import numpy as np

vertex_features = ['Charge', 'Time', 'TimeDelta', 'TimeSinceLastPulse']
features = {feature: [] for feature in vertex_features}

hit_order = np.argsort(features['Time'])

for feature in features:
    features[feature] = np.array(features[feature])[hit_order]

或者在声明字典推导式的时候,将列表包装起来:

import numpy as np

vertex_features = ['Charge', 'Time', 'TimeDelta', 'TimeSinceLastPulse']
features = {feature: np.array([]) for feature in vertex_features}

hit_order = np.argsort(features['Time'])

for feature in features:
    features[feature] = features[feature][hit_order]

1
谢谢你的回答,它起作用了。但是我有一个问题(可能很蠢)。在第一个答案中,对于feature in features:features [feature] = np.array(features [feature])[hit_order]; 当我关闭圆括号时它不起作用。为什么会这样? - PKL
@ParasKoundal,说实话我不太确定,你可能需要仔细检查一下你的代码。在我的机器上,它似乎可以在解释器中运行得很好。 - Benjamin Rowell

1
一个numpy的ndarray和Python的list是不同的。它们可以轻松地相互转换,但只有一个ndarray可以接受另一个ndarray作为索引。对于Python列表,惯用的方法是使用推导式。
由于features包含普通列表,因此必须选择一种方式:
  1. convert to numpy array:

    for feature in features:
        features[feature] = np.array(features[feature])[hit_order]
    
  2. build a list with a comprehension:

    for feature in features:
        features[feature] = [features[feature][i] for i in hit_order]
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接