Числовая сортировка строк в Python - PullRequest
0 голосов
/ 29 октября 2018

Как мне заставить сортировку Python вести себя как sort -n из GNU coreutils?

Это мой images.txt:

Vol. 1/Vol. 1 - Special 1/002.png
Vol. 1/Chapter 2 example text/002.png
Vol. 1/Vol. 1 Extra/002.png
Vol. 1/Chapter 2 example text/001.png
Vol. 1/Vol. 1 Extra/001.png
Vol. 1/Chapter 1 example text/002.png
Vol. 1/Vol. 1 - Special 1/001.png
Vol. 1/Chapter 1 example text/001.png

Когда я запускаю этот скрипт Bash:

#!/bin/bash

cat images.txt | sort -n

Я получаю следующий вывод:

Vol. 1/Chapter 1 example text/001.png
Vol. 1/Chapter 1 example text/002.png
Vol. 1/Chapter 2 example text/001.png
Vol. 1/Chapter 2 example text/002.png
Vol. 1/Vol. 1 Extra/001.png
Vol. 1/Vol. 1 Extra/002.png
Vol. 1/Vol. 1 - Special 1/001.png
Vol. 1/Vol. 1 - Special 1/002.png

Но когда я запускаю этот скрипт на Python:

#!/usr/bin/env python3

images = []

with open("images.txt") as images_file:
    for image in images_file:
        images.append(image)

images = sorted(images)

for image in images:
    print(image, end="")

Я получаю следующий вывод, который мне не нужен:

Vol. 1/Chapter 1 example text/001.png
Vol. 1/Chapter 1 example text/002.png
Vol. 1/Chapter 2 example text/001.png
Vol. 1/Chapter 2 example text/002.png
Vol. 1/Vol. 1 - Special 1/001.png
Vol. 1/Vol. 1 - Special 1/002.png
Vol. 1/Vol. 1 Extra/001.png
Vol. 1/Vol. 1 Extra/002.png

Как мне добиться того же результата с Python, что и с Bash и sort -n?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы также можете рассмотреть лямбду, которая заменяет все не буквенно-цифровые символы

images = sorted(images, key=lambda x: re.sub('[^A-Za-z\d]+', '', x))
0 голосов
/ 29 октября 2018

Хотя я не эксперт, кажется, '-' упорядочено иначе, чем Python. Быстрое решение этой конкретной проблемы - заменить ' - ' на ' ' при сортировке:

L = sorted(L, key=lambda x: x.replace(' - ', ' '))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...