У меня проблема с моим кодом. Я пытаюсь распечатать в числовом порядке имя папки, получая информацию из файла 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, но безуспешно.
Итак, похоже, вам лучше удалить префиксы цветов, а затем просто сохранить числа. Если вы это сделаете, вы можете привести к 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]
Загляните в библиотеку нацсорта