Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用其中一个子字典的值对所有子字典进行排序_Python_Python 3.x - Fatal编程技术网

Python 使用其中一个子字典的值对所有子字典进行排序

Python 使用其中一个子字典的值对所有子字典进行排序,python,python-3.x,Python,Python 3.x,我有如下的数据结构,并希望对 要根据“顺序”列的值进行排序的所有子字典 输入: to_sort = [ ('Fruits', { 'size': {1:[4, 2, 7,9]}, 'name': {1:['Orange', 'Apple', 'Kiwi', 'Mango']}, 'color': {1:['Orange', 'Red', 'Brown','Green']}, 'order': {1:[2, 1, 4,3]} } ) ] 输出:

我有如下的数据结构,并希望对 要根据“顺序”列的值进行排序的所有子字典

输入:

to_sort = [
('Fruits', 
    {
    'size': {1:[4, 2, 7,9]}, 
    'name': {1:['Orange', 'Apple', 'Kiwi', 'Mango']},
    'color': {1:['Orange', 'Red', 'Brown','Green']},
    'order': {1:[2, 1, 4,3]}
    }
)
]
输出:

[
('Fruits', 
    {
    'size': {1:[2, 4, 9, 7]}, 
    'name': {1:['Apple', 'Orange', 'Mango', 'Kiwi']},
    'color':{1:['Red', 'Orange', 'Green', 'Brown']},
    'order':{1:[1, 2, 3, 4]}
    }
)
]
我试着用lambda

sort = to_sort[1]
print(sorted(sort.items(), key=lambda i: i['order'].values()))

我得到了“元组索引必须是整数或切片,而不是str”错误

假设您可以按照评论中提到的修改数据结构,这将对您有效。这是根据另一个问题改编的:

其结果是:

[(
    'Fruits',
    {
        'color': ['Red', 'Orange', 'Green', 'Brown'],
        'size': [2, 4, 9, 7],
        'order': [1, 2, 3, 4],
        'name': ['Apple', 'Orange', 'Mango', 'Kiwi']
    }
)]
可以对其进行修改以适应现有的数据结构,但如果可能的话,我建议进行更改。

如何处理现有数据结构 您现有的数据结构有点疯狂,但我将如何处理它(编辑假设颜色列表的键是
123
):

让我们来分析一下:首先,我制作了一个规范的键列表,并找到了
'order'
的索引:

>>> keys = list(to_sort[0][1].keys())
>>> idx = keys.index('order')
下一步是将内部列表压缩成元组,其中每个项目共享相同的相对位置:

>>> list(zip(*(d[k][n] for k in keys for n in d[k])))
[(4, 2, 'Orange', 'Orange'), (2, 1, 'Red', 'Apple'), (7, 4, 'Brown', 'Kiwi'), (9, 3, 'Green', 'Mango')]
现在可以根据
idx
位置对其进行排序,然后“解压缩”(这实际上只是意味着再次应用组合:

>>> list(zip(*sorted(zip(*(d[k][n] for k in keys for n in d[k])), key=lambda t:t[idx])))
[(2, 4, 9, 7), (1, 2, 3, 4), ('Red', 'Orange', 'Green', 'Brown'), ('Apple', 'Orange', 'Mango', 'Kiwi')]
最后,使用字典理解功能重建疯狂字典,确保使用原始键压缩有序值:

>>> ordered_kv = zip(keys, zip(*sorted(zip(*(d[k][n] for k in keys for n in d[k])), key = lambda t:t[idx])))
>>> sorted_dict = {k:{n:list(v) for n in d[k]} for k,v in ordered_kv}
>>> from pprint import pprint
>>> pprint(sorted_dict)
{'color': {123: ['Red', 'Orange', 'Green', 'Brown']},
 'name': {1: ['Apple', 'Orange', 'Mango', 'Kiwi']},
 'order': {1: [1, 2, 3, 4]},
 'size': {1: [2, 4, 9, 7]}}
然而。。。

你应该考虑使用<代码>熊猫> /代码>库来处理这样的数据。观察:

>>> import pandas as pd
>>> df = pd.DataFrame({k: pd.Series(v[1]) for k,v in to_sort[0][1].items()})
>>> df
    color    name  order  size
0  Orange  Orange      2     4
1     Red   Apple      1     2
2   Brown    Kiwi      4     7
3   Green   Mango      3     9
请注意,我仍然需要将原始数据结构伪装成一个
pandas
数据帧,但如果您从
DataFrame
开始做任何事情,一切都会简单得多。现在您可以做一些很酷的事情,例如:

>>> df.sort_values('order')
    color    name  order  size
1     Red   Apple      1     2
0  Orange  Orange      2     4
3   Green   Mango      3     9
2   Brown    Kiwi      4     7

字典中的每一项都是有一个列表的字典,这有什么原因吗?它们可以仅仅是列表吗?等等,那么你想对子字典的列表值进行排序。毕竟,字典是无序的……是的,你想做的是可能的,但有点头疼。我知道这并不总是可能的,但我会重新考虑你你这里的数据结构…就像著名的Jameous指出的那样,为什么不能例如
size
简单地有一个
[2,4,9,7]
?这不是一个有效的字典。你能修复它吗?@ayhan我知道你只是想把它放到一个数据帧中…有一个陷阱。“{color':{1:”可以是“{color':{12:{color':{123:”在这种情况下,sorted_values=zip(*sorted(到_sort[0][1][k][1]将不起作用。我们必须替换整个值sorted_values=zip(*sorted(到_sort[0][1][k][“value”])。知道怎么做吗。
>>> import pandas as pd
>>> df = pd.DataFrame({k: pd.Series(v[1]) for k,v in to_sort[0][1].items()})
>>> df
    color    name  order  size
0  Orange  Orange      2     4
1     Red   Apple      1     2
2   Brown    Kiwi      4     7
3   Green   Mango      3     9
>>> df.sort_values('order')
    color    name  order  size
1     Red   Apple      1     2
0  Orange  Orange      2     4
3   Green   Mango      3     9
2   Brown    Kiwi      4     7