python递归排序所有嵌套的iterable

Posted

技术标签:

【中文标题】python递归排序所有嵌套的iterable【英文标题】:python recursively sort all nested iterable 【发布时间】:2018-11-08 16:31:56 【问题描述】:

如何在一个可迭代对象中递归地对所有嵌套的可迭代对象进行排序?

例如

d = 
    'e': ['y': 'y', 'x': ['2': 2, '1': 1]],
    'x': ['c', 'b', 'a'],
    'z': 
        'a': [3, 1, 2],
        'd': ['y': [6,5,1], 'w': 1],
        'c': '2': 2, '3': 3, '4': 4
    ,
    'w': 1:1, 2:2, 3:3

我是这样的输出

'e': ['x': ['1': 1, '2': 2], 'y': 'y'],
 'w': 1: 1, 2: 2, 3: 3,
 'x': ['a', 'b', 'c'],
 'z': 'a': [1, 2, 3],
       'c': '2': 2, '3': 3, '4': 4,
       'd': ['w': 1, 'y': [1, 5, 6]]

【问题讨论】:

【参考方案1】:

你可以使用递归:

import json
d = 'x': ['c', 'b', 'a'], 'z': 'a': [3, 1, 2], 'c': '3': 3, '2': 2, '4': 4, 'd': ['y': [6, 5, 1], 'w': 1], 'e': ['y': 'y', 'x': ['1': 1, '2': 2]], 'w': 1: 1, 2: 2, 3: 3
def sort_nested(c):
   if not isinstance(c, dict):
     return sorted(c) if isinstance(c, list) else c
   return a:sorted(sort_nested(i) for i in b) if isinstance(b, list) else sort_nested(b) for a, b in c.items()

print(json.dumps(sort_nested(d), indent=4))

输出:


 "x": [
    "a", 
    "b", 
    "c"
], 
"z": 
    "a": [
        1, 
        2, 
        3
    ], 
    "c": 
        "3": 3, 
        "2": 2, 
        "4": 4
    , 
    "d": [
        
            "w": 1
        , 
        
            "y": [
                1, 
                5, 
                6
            ]
        
    ]
, 
"e": [
    
        "x": [
            
                "1": 1, 
                "2": 2
            
        ]
    , 
    
        "y": "y"
    
 ], 
  "w": 
    "1": 1, 
    "2": 2, 
    "3": 3
   

【讨论】:

哈哈真的不确定【参考方案2】:
from pprint import pprint
d = 
    'e': ['y': 'y', 'x': ['2': 2, '1': 1]],
    'x': ['c', 'b', 'a'],
    'z': 
        'a': [3, 1, 2],
        'd': ['y': [6,5,1], 'w': 1],
        'c': '2': 2, '3': 3, '4': 4
    ,
    'w': 1:1, 2:2, 3:3

def rec_sort(iterable):
    """Recursively sort
    """
    def sort_dict_key(x):
        if isinstance(x, dict):
            return sorted(x.keys(), key=sort_dict_key)
        return x
    if isinstance(iterable, dict):
        d = 
        for k, v in iterable.items():
            d[k] = rec_sort(v)
    elif isinstance(iterable, list):
        iterable.sort(key=sort_dict_key)
        for pos,item in enumerate(iterable):
            iterable[pos] = rec_sort(item)
    return iterable

pprint(rec_sort(d))

【讨论】:

以上是关于python递归排序所有嵌套的iterable的主要内容,如果未能解决你的问题,请参考以下文章

我的 python 递归快速排序算法有啥问题?

快速排序基本思想,递归写法,python和java编写快速排序

打印python嵌套字典的所有值的完整键路径

python-递归函数,嵌套函数

如何一次对字典或列表中的所有嵌套字典和列表进行排序?

嵌套for循环以在Python中递归