Сортировка пузырьков из текстового файла - PullRequest
0 голосов
/ 19 февраля 2019

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

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.
first = []
last = []
address = []

first = []
last = []
address = []

f = open('/Users/calebcalter/Desktop/sorting.txt', 'r')
last_sort = f.read()

print(last_sort)

length = len(last_sort)

for i in range(length):
    for o in range(length-1):
        if last_sort[o] > last_sort[o+1]:
            last_sort[o], last_sort[o+1] = last_sort[o+1], last_sort[o]
            print(last_sort)

1 Ответ

0 голосов
/ 19 февраля 2019

В программе критическая ошибка, вы используете 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.']
...