В программе критическая ошибка, вы используете f.read()
, который читает весь файл в строку, и отсюда что-либо не имеет никакого смысла ,
Чтобы прочитать его как список строк (где каждая строка является строкой), используйте f.readlines()
(проверьте [Python 3]: Методы файловых объектов для получения более подробной информации).
Затем вы сравниваете целые строки (так что ваша сортировка выполняется в основном по имени , которое является 1 st частью каждой строки),Чтобы отсортировать по фамилии (которая является частью 2 и ), вам необходимо:
- Разделить каждую строку на ", "(чтобы получить его части)
- Выполните сравнение по 2 и части (индекс 1 ), которая является фамилией
Наконец, ваш внешний цикл представляет собой для (который включает фиксированное число ( N )) шагов):
- Я не тратил время на размышления о том, достаточно ли этого для какого-либо списка (какое максимальное количество раз необходимо просмотреть список, чтобы выполнить все перестановки).В любом случае, если это не так, вы можете получить список, который не будет отсортирован
- Другой конец: если нужно поменять местами только последние 2 значения в списке (и, таким образом, обход списка один раздостаточно), вы все еще проходите его N раз
- Учитывая вышеизложенное, я переключился на , а , который перебирает список допоследний обход не выполнял никакого обмена (то есть он уже отсортирован)
Ниже только часть сортировки , извлеченная (и измененная) из вашего кода.Обратите внимание, что, поскольку все только для демонстрационных целей:
- Нет проверки ошибок
- Существуют способы улучшить производительность с точки зрения производительности, но они выходят за пределы текущей области
code.py :
#!/usr/bin/env python3
import sys
def last_name_bubble(records):
length = len(records)
done = False
while not done:
done = True
for i in range(length - 1):
#if records[i] > records[i + 1]: # This is your original condition
if records[i].split(",")[1].strip() > records[i + 1].split(",")[1].strip():
records[i], records[i + 1] = records[i + 1], records[i]
done = False
#print(records)
def main():
person_list = [
"Dayn,Overton,45 Ashton Way",
"Fanny,York,71 Luck Ln.",
"Maxine,Pierson,876 Kiwi St.",
"Candi,Robertson,25 Lake View",
"Dex,Brooks,94 Sunny Cir.",
]
print(person_list)
last_name_bubble(person_list)
print(person_list)
if __name__ == "__main__":
print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
main()
Выход :
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054769022]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
['Dayn,Overton,45 Ashton Way', 'Fanny,York,71 Luck Ln.', 'Maxine,Pierson,876 Kiwi St.', 'Candi,Robertson,25 Lake View', 'Dex,Brooks,94 Sunny Cir.']
['Dex,Brooks,94 Sunny Cir.', 'Dayn,Overton,45 Ashton Way', 'Maxine,Pierson,876 Kiwi St.', 'Candi,Robertson,25 Lake View', 'Fanny,York,71 Luck Ln.']