list.sort()
classifica a lista e substitui a lista original, enquanto sorted(list)
retorna uma cópia classificada da lista, sem alterar a lista original.
- Quando um prefere o outro?
- Qual é mais eficiente? Por quanto?
- Uma lista pode ser revertida para o estado não classificado após a
list.sort()
execução?
sorted()
em um argumento de cadeia, mas acho que é uma lista, você obter um resultado lista, não uma string :sorted("abcd", reverse=True)
dá['d', 'c', 'b', 'a']
não"dcba"
Respostas:
sorted()
retorna uma nova lista classificada, deixando a lista original inalterada.list.sort()
classifica a lista no local , modificando os índices da lista e retornaNone
(como todas as operações no local).sorted()
funciona em qualquer iterável, não apenas em listas. Strings, tuplas, dicionários (você receberá as chaves), geradores, etc., retornando uma lista contendo todos os elementos, classificados.Use
list.sort()
quando quiser alterar a lista,sorted()
quando quiser um novo objeto classificado de volta. Usesorted()
quando quiser classificar algo que é iterável, e não uma lista ainda .Para listas,
list.sort()
é mais rápido do quesorted()
porque não precisa criar uma cópia. Para qualquer outro iterável, você não tem escolha.Não, você não pode recuperar as posições originais. Depois que você ligou,
list.sort()
o pedido original se foi.fonte
None
, é um sinal de que as operações são feitas no local, por isso, quando você deseja imprimi-list.sort()
la, retorna None.list.sort
altera a lista no local e retornaNone
sorted
pega qualquer iterável e retorna uma nova lista, classificada.sorted
é equivalente a esta implementação do Python, mas a função embutida do CPython deve ser executada de forma mensurável mais rápida, como está escrito em C:list.sort
quando não desejar manter a ordem de classificação original (portanto, você poderá reutilizar a lista no local na memória.) E quando for o único proprietário da lista (se a lista for compartilhada por outro código e você para modificá-lo, você pode introduzir bugs onde essa lista é usada.)sorted
quando desejar manter a ordem de classificação original ou quando desejar criar uma nova lista que apenas o código local possua.Não - a menos que você tenha feito uma cópia, essas informações são perdidas porque a classificação é feita no local.
Para ilustrar a penalidade de criar uma nova lista, use o módulo timeit, aqui está nossa configuração:
E aqui estão nossos resultados para uma lista de 10000 números aleatoriamente organizados, como podemos ver aqui, refutamos um mito de despesas de criação de lista mais antigo :
Python 2.7
Python 3
Após algum feedback, decidi que outro teste seria desejável com características diferentes. Aqui eu forneço a mesma lista ordenada aleatoriamente de 100.000 de comprimento para cada iteração 1.000 vezes.
Eu interpreto a diferença desse tipo maior proveniente da cópia mencionada por Martijn, mas não domina até o ponto indicado na resposta mais antiga e popular aqui, aqui o aumento no tempo é de apenas 10%
Também executei o procedimento acima em uma classificação muito menor e vi que a nova
sorted
versão da cópia ainda leva cerca de 2% mais tempo de execução em uma espécie de comprimento 1000.Poke também executou seu próprio código, eis o código:
Ele encontrou uma classificação de 1000000 comprimentos ((executou 100 vezes) um resultado semelhante, mas apenas um aumento de 5% no tempo, eis a saída:
Conclusão:
Uma lista grande e classificada com
sorted
uma cópia provavelmente dominará as diferenças, mas a própria classificação domina a operação, e organizar seu código em torno dessas diferenças seria uma otimização prematura. Usariasorted
quando necessitasse de uma nova lista ordenada de dados e usarialist.sort
quando precisasse ordenar uma lista no local e permitir que isso determinasse meu uso.fonte
sorted()
precisa alocar um novo objeto de lista e copiar as referências; o restante dos caminhos de código são idênticos. Veja se você pode executar os mesmos testes com listas maiores. Compare-o apenas com a criação de cópias de listas e veja se você consegue replicar as diferenças encontradas, etc.A principal diferença é que
sorted(some_list)
retorna um novolist
:e
some_list.sort()
, classifica a lista no lugar :Observe que, como
a.sort()
não retorna nada,print a.sort()
será impressoNone
.As posições originais de uma lista podem ser recuperadas após list.sort ()?
Não, porque modifica a lista original.
fonte
print a.sort()
não imprimirá nada.None
, vou esclarecer isso.A função .sort () armazena o valor da nova lista diretamente na variável list; então a resposta para sua terceira pergunta seria NÃO. Além disso, se você fizer isso usando classificado (lista), poderá usá-lo porque não está armazenado na variável de lista. Às vezes, o método .sort () atua como função ou diz que recebe argumentos nele.
Você precisa armazenar o valor de classificado (lista) em uma variável explicitamente.
Também para processamento de dados curtos, a velocidade não terá diferença; mas para listas longas; você deve usar diretamente o método .sort () para um trabalho rápido; mas novamente você enfrentará ações irreversíveis.
fonte
list.sort()
método classifica o objeto de lista no local..sort()
método usa argumentos e atua como função. Também o chamamos de método porque é um atributo do tipo de dados da lista.Aqui estão alguns exemplos simples para ver a diferença de ação:
Veja a lista de números aqui:
Ao chamar
sorted
esta lista,sorted
fará uma cópia da lista. (Isso significa que sua lista original permanecerá inalterada.)Vamos ver.
retorna
Olhando para o
nums
novoVemos a lista original (inalterada e NÃO classificada).
sorted
não alterou a lista originalTomando a mesma
nums
lista e aplicando asort
função nela, a lista atual será alterada.Vamos ver.
Começando com nossa
nums
lista para garantir que o conteúdo ainda seja o mesmo.Agora a lista de números originais foi alterada e, observando os números, vemos que nossa lista original foi alterada e agora está classificada.
fonte
sort () não retorna nenhum valor.
O método sort () apenas classifica os elementos de uma determinada lista em uma ordem específica - Crescente ou Decrescente sem retornar nenhum valor.
A sintaxe do método sort () é:
fonte