Возникли проблемы с подсчетом диктов в python

У меня проблема с моим кодом. Я пытаюсь распечатать в числовом порядке имя папки, получая информацию из файла Report.csv этой папки.

red = []
black = []
orange = []

for x in dirs:
    if x[0:3] == "red":
        red.append(x)     
    elif x[0:5] == "black":
        black.append(x)
    elif x[0:6] == "orange":
        orange.append(x)

for x in red:
    print(f"{x}:")
    try:
        df = pd.read_csv(x + "/Report.csv")
        df_filter= df[['Start','ID','Name',"Type", "Status", "Info"]]
        testFilter = df_filter[(df_filter.Type == 'Test')]
        if testFilter['Status'].str.contains('Fail').any():
            fullFinalTable= testFilter[['Start','ID','Name', "Info"]]
            print(fullFinalTable)
        else:
            print("No errors.")
    except FileNotFoundError:
        print("File does not exist")

При выполнении print(f"{x}:") я получу следующий вывод

red1
red10
red11
.
.
.
red19
red2
red20
red21
.
.
.

Тем не менее, я пытаюсь убедиться, что это в числовом порядке (red1, red2, red3...red10, red11, etc). Я пытался преобразовать x в float и integer, но безуспешно.

Загляните в библиотеку нацсорта

Mad Physicist 18.12.2020 21:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Итак, похоже, вам лучше удалить префиксы цветов, а затем просто сохранить числа. Если вы это сделаете, вы можете привести к int, а затем отсортировать по числам.

red = []
for x in dirs:
   if x.startswith('red'): # startswith is just easier to read, for me.
       red.append(int(x[3:])) # store only the number part, and store it as an integer.
                              # That way it will be sorted numerically by `sorted` below.

# Just sorting inline because why not? It looks cleaner to me.
for x in sorted(red):
    full_name = 'red' + str(x)

    print(f"{x}:")

    # Do what you were doing before.

Если вам нужно что-то более подробное, то я бы порекомендовал библиотеку natsort. Он имеет множество различных опций, которые решают менее интуитивные проблемы сортировки в программировании. Это базовый пример, который напрямую решает вашу проблему:

>>> from natsorted import natsorted
>>> a = ['version-1.9', 'version-2.0', 'version-1.11', 'version-1.10']
>>> natsorted(a)
['version-1.9', 'version-1.10', 'version-1.11', 'version-2.0']

А вот их пример для humansorted

>>> a = ['Apple', 'Banana', 'apple', 'banana']
>>> natsorted(a)
['Apple', 'Banana', 'apple', 'banana']
>>> humansorted(a)
['apple', 'Apple', 'banana', 'Banana']
Ответ принят как подходящий

Пожалуйста, попробуйте это

red_order = [int(x.replace('red','')) for x in red]
red_order.sort()
red = ['red'+str(x) for x in red_order]

Другие вопросы по теме