Classificando um dicionário on __iter__
-
01-07-2019 - |
Pergunta
Eu estou tentando classificar um dicionário baseado em sua chave e retornar um iterador para os valores de dentro de um método iter substituído em uma classe. Existe uma melhor e mais eficiente maneira de fazer isso do que criar uma nova lista, inserir na lista como eu classifico através das teclas?
Solução
Como sobre algo como isto:
def itersorted(d):
for key in sorted(d):
yield d[key]
Outras dicas
De longe, a abordagem mais fácil, e quase certamente o mais rápido, é algo ao longo das linhas de:
def sorted_dict(d):
keys = d.keys()
keys.sort()
for key in keys:
yield d[key]
Você não pode tipo sem retornar todas as chaves. Buscar todas as chaves em uma lista e, em seguida, classificar essa lista é a maneira mais eficiente de fazer isso; lista de classificação é muito rápido, e ao obter a lista chaves como que é tão rápido quanto ele pode ser. Você pode então criar uma nova lista de valores ou ceder os valores como o exemplo faz. Tenha em mente que você não pode modificar o dict se você é a iteração sobre ele (a próxima iteração falharia) então se você quiser modificar o dict antes que você fez com o resultado de sorted_dict (), fazê-lo retornar uma lista .
def sortedDict(dictobj):
return (value for key, value in sorted(dictobj.iteritems()))
Isto irá criar uma única lista intermediária, o 'ordenado ()' método retorna uma lista real. Mas pelo menos é único.
Assumindo que você quer uma ordem de classificação padrão, você pode utilizar classificadas (lista) ou list.sort (). Se você quer sua própria lógica de classificação, listas de Python suporta a capacidade de classificar com base em uma função que passar. Por exemplo, o seguinte seria uma maneira de ordenar os números do menor para o maior (o comportamento padrão) usando uma função.
def compareTwo(a, b):
if a > b:
return 1
if a == b:
return 0
if a < b:
return -1
List.Sort(compareTwo)
print a
Esta abordagem é conceitualmente um pouco mais limpo do que criar manualmente uma nova lista e anexando os novos valores e permite-lhe controlar a lógica tipo.