Eu sei que isso parece trivial, mas eu não percebi que a sort()
função do Python era estranha. Eu tenho uma lista de "números" que estão realmente na forma de seqüência de caracteres, então primeiro os converto em ints e, em seguida, tente uma classificação.
list1=["1","10","3","22","23","4","2","200"]
for item in list1:
item=int(item)
list1.sort()
print list1
Dá-me:
['1', '10', '2', '200', '22', '23', '3', '4']
O que eu quero é
['1','2','3','4','10','22','23','200']
Procurei alguns dos algoritmos associados à classificação de conjuntos numéricos, mas os que encontrei envolvem a classificação de conjuntos alfanuméricos.
Eu sei que este é provavelmente um problema óbvio, mas o google e meu livro não oferecem nada mais ou menos útil do que a .sort()
função.
list1
. O que fez você pensar quelist
estava sendo atualizado?sorted(mylist)
Respostas:
Você não converteu suas strings em ints. Ou melhor, você fez, mas não fez nada com os resultados. O que você quer é:
Se, por algum motivo, você precisar manter seqüências de caracteres em vez de ints (geralmente uma má ideia, mas talvez seja necessário preservar zeros à esquerda ou algo assim), use uma função de tecla .
sort
usa um parâmetro nomeadokey
, que é uma função que é chamada em cada elemento antes de ser comparada. Os valores de retorno da função-chave são comparados em vez de comparar diretamente os elementos da lista:fonte
list1 = list1.sort(key=int)
, use justlist1.sort(key=int)
e list1 já estará classificado.Você poderia passar uma função para o
key
parâmetro para o.sort
método . Com isso, o sistema classificará pela tecla (x) em vez de x.BTW, para converter a lista em números permanentemente, use a
map
funçãoou compreensão da lista
fonte
Caso você queira usar a
sorted()
função:sorted(list1, key=int)
Retorna uma nova lista classificada.
fonte
O tipo de Python não é estranho. É apenas que este código:
não está fazendo o que você pensa que é -
item
não é substituído novamente na lista, é simplesmente jogado fora.De qualquer forma, a solução correta é usar
key=int
como outras pessoas lhe mostraram.fonte
Você também pode usar:
Isso é muito semelhante a outras coisas que você pode encontrar na internet, mas também funciona para alfanuméricos como
[abc0.1, abc0.2, ...]
.fonte
A resposta de Seamus Campbell não funciona em python2.x.
list1 = sorted(list1, key=lambda e: int(e))
usar alambda
função funciona bem.fonte
Abordei o mesmo problema ontem e encontrei um módulo chamado [natsort] [1], que resolve o seu problema. Usar:
Também funciona para dicionários como equivalente a
sorted
. [1]: https://pypi.org/project/natsort/fonte
Tente isso, ele classificará a lista no local em ordem decrescente (não é necessário especificar uma chave nesse caso):
Processo
resultado:
fonte
A solução mais recente está certa. Você está lendo as soluções como uma sequência; nesse caso, a ordem é 1, depois 100, depois 104, seguida por 2 e 21, 2001001010, 3 e assim por diante.
Você deve CAST sua entrada como int:
strings ordenadas:
stringList = (1, 10, 2, 21, 3)
ints classificados:
intList = (1, 2, 3, 10, 21)
Para transmitir, basta colocar a stringList dentro de int (blahblah).
Novamente:
fonte
Se você quiser usar seqüências de caracteres dos números, melhor tomar outra lista, como mostrado no meu código, funcionará bem.
fonte
Maneira simples de classificar uma lista numérica
fonte
O verdadeiro problema é que esse tipo classifica as coisas alfanumericamente. Portanto, se você tiver uma lista ['1', '2', '10', '19'] e executar a ordenação, obterá ['1', '10'. '19', '2']. ou seja, 10 vem antes de 2 porque olha para o primeiro caractere e classifica a partir dele. Parece que a maioria dos métodos em python retorna as coisas nessa ordem. Por exemplo, se você tiver um diretório chamado abc com os arquivos rotulados como 1.jpg, 2.jpg etc, diga até 15.jpg e faça file_list = os.listdir (abc), a file_list não será solicitada conforme o esperado, mas sim como file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]. Se a ordem na qual os arquivos são processados for importante (presumivelmente é por isso que você os nomeou numericamente), a ordem não será a que você pensa que será. Você pode evitar isso usando o preenchimento "zeros". Por exemplo, se você tiver uma lista alist = ['01', '03', '05', '10', '02', '04', '06] e executar a classificação nela, obterá a ordem desejada. alist = ['01', '02' etc] porque o primeiro caractere é 0, que vem antes de 1. A quantidade de preenchimento de zeros que você precisa é determinada pelo maior valor da lista.Por exemplo, se o maior for digitado entre 100 e 1000, você precisa preencher dígitos únicos como 001, 002-010,011--100, 101 etc.
fonte
Isso funcionou para mim usando o python versão 3, embora não na versão 2.
fonte