我正在尝试使用字典结构对数据文件进行排序。这样,我将按字典的第一个值内容对字典进行排序,例如,字典值的第一行/列。
我遇到的问题是,当使用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.]])}
您会收到此错误,因为您的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])}
您几乎与代码行都在那儿。
您在lambda函数中所做的就是提取item [1]。这是(键,值)元组的第一个条目,在这种情况下,您仅提取数组。现在您无法对整个数组进行排序,因此可以执行以下操作:
d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1].flatten()[0])}
这里您使用np.array.flatten方法展平数组,并使用第一个条目进行排序。
您需要做的是将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])}