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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top