Python - упорядочить вложенный список в алфавитном порядке - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть следующий список:

["stephane", "philippe", "hélène", ["hugo", "jean-michel", "fernand"], "gustave"]

И я бы хотел заказать его так:

["gustave", "hélène", ["fernand", "hugo", "jean-michel"], "philippe", "stephane"]

Примечание: если после пользователя есть вложенный список, этосписок должен оставаться справа от этого пользователя.

Кроме того, все вложенные списки работают одинаково.Это рекурсивно.

Ответы [ 2 ]

6 голосов
/ 12 сентября 2011

Ваши данные звучат так, как будто их лучше представить в виде словаря. Списки, в которых последовательные элементы имеют особые отношения, звучат странно.

Если вы вместо этого представляете свои данные следующим образом:

{
  "stephane": {}, 
  "philippe": {}, 
  "hélène": {
    "hugo": {}, 
    "jean-michel": {},
    "fernand": {},
  }, 
  "gustave": {},
}

Затем вы можете просто отсортировать ключи словарей, чтобы получить нужный вам порядок.

2 голосов
/ 12 сентября 2011

Я использовал предложение Неда и придумал следующее:

d = {
    "stephane": {}, 
    "philippe": {}, 
    "helene": {
        "hugo": {}, 
        "jean-michel": {},
        "fernand": {},
    }, 
    "gustave": {},
}

def sort_dict_as_list(d):
    sorted_list = []
    for k, v in sorted(d.items()):
        if k:    
            sorted_list.append(k)
        if v:
            sorted_list.append(v)
    return sorted_list

def sort_recursive(d):
    if d:
        for k, v in d.items():
            d[k] = sort_recursive(v)
        return sort_dict_as_list(d)
    else:
        return d

if __name__ == "__main__":
    print sort_recursive(d)

выход

python sortit.py
['gustave', 'helene', ['fernand', 'hugo', 'jean-michel'], 'philippe', 'stephane']

Я не проверил это полностью, но это отправная точка. Я пытался решить это с помощью списка в виде структуры данных, но в итоге я вложил рекурсивные функции, и это было слишком уродливо ... Предложение Неда было действительно хорошим.

...