将带有2d 列表的字典按第一个值排序

问题描述 投票:1回答:3

我正在尝试使用字典结构对数据文件进行排序。这样,我将按字典的第一个值内容对字典进行排序,例如,字典值的第一行/列。

我遇到的问题是,当使用lambda对字典进行排序时,它不接受lambda item:item[1],我相信它对应于original_dict的值。现在,这就是我所拥有的:

original_dict = {'file1.txt': array([[ 9., 40., 50., 20.],[10., 40., 50., 20.]]), 
                 'file2.txt':array([[1., 2., 3., 4.],[2., 2., 3., 4.]]), 
                 'file3.txt': array([[0.1, 0.2, 0.3, 0.4],[0.2, 0.2, 0.3, 0.4]])}

d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1])}

返回

ValueError:具有多个元素的数组的真值是暧昧。使用a.any()或a.all()

所需的输出

d2 = {'file3.txt': array([[0.1, 0.2, 0.3, 0.4],[0.2, 0.2, 0.3, 0.4]]), 
      'file2.txt':array([[1., 2., 3., 4.],[2., 2., 3., 4.]]), 
      'file1.txt': array([[ 9., 40., 50., 20.],[10., 40., 50., 20.]])}
python sorting dictionary
3个回答
1
投票

您会收到此错误,因为您的key=参数需要访问数字值。在您的情况下,您正在提取矩阵。因此,当sorted()尝试对数组进行排序时,它将尝试比较2个Numpy矩阵-您的键。它不适用于numpy,因为numpy在比较矩阵时会生成布尔矩阵,而不是单个数值。因此python不知道该如何处理。

根据您的情况,您需要考虑要使用的确切标准。它是第一行中的第一个值吗?它是第一行中值的总和吗?矩阵总和?

以下是一些适合您的示例:

# Sort by the matrix total sum
d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1].sum())}

# Sort by the first row sum
d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1][0].sum())}

# Sort by the first element of the first row
d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1][0, 0])}

2
投票

您几乎与代码行都在那儿。

您在lambda函数中所做的就是提取item [1]。这是(键,值)元组的第一个条目,在这种情况下,您仅提取数组。现在您无法对整个数组进行排序,因此可以执行以下操作:

d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1].flatten()[0])}

这里您使用np.array.flatten方法展平数组,并使用第一个条目进行排序。


0
投票

您需要做的是将dictionary.items()方法的返回值转换为列表。返回值不可下标,因此可能是错误的来源

original_dict = {'file1.txt': array([[ 9., 40., 50., 20.],[10., 40., 50., 20.]]), 
                 'file2.txt':array([[1., 2., 3., 4.],[2., 2., 3., 4.]]), 
                 'file3.txt': array([[0.1, 0.2, 0.3, 0.4],[0.2, 0.2, 0.3, 0.4]])}


d2 = {k: v for k, v in sorted(list(original_dict.items()), key=lambda item: item[1])}
© www.soinside.com 2019 - 2024. All rights reserved.