(Python) Сортировка фильма по продажам с использованием файлового ввода и вывода - PullRequest
0 голосов
/ 11 марта 2019

Моя программа ' технически ' работает ... но должно быть лучшее решение.

Итак, в текстовом файле есть список из 500 лучших фильмов в случайном порядке.

Avatar    71245151
Star Wars    92815125
Matrix    4215151  ......

Вопрос заключается в том, чтобы создать функцию, которая принимает текстовый файл в качестве входных данных и записывать 500 лучших фильмов по порядку (от наивысшего к наименьшему объему продаж) в другой файл.

def sort_films(file_name, destination_file):
    open_file = open(file_name, "r")    #Read the file
    movie_list = []

    for line in open_file:
       movie_list.append(line.split("\t")) #Since "\t" exists, split

    open_file.close()    

Здесь, movie_list будет выглядеть примерно так

movie_list = [['Avatar', '5241521\n'], ['Star Wars', '9512512'], ....]

Так как нам не нужны разрывы строк при преобразовании строки чисел в целые числа и сортировке чисел от высокого к низкому, это то, что я сделал. Я также помещаю числа в начале каждого списка, потому что sort () сортирует фильмы в алфавитном порядке, а это не то, что мне нужно.

    for movie in movie_list:
        movie.insert(0, movie[1])
        movie.pop()
    for movie in movie_list:
        movie[0] = int(movie[0].replace("\n", ""))


    movie_list.sort(reverse = True)

Теперь я собираюсь написать файлы.

    open_file = open(destination_file, "w")

    string = ""

Я добавил разрыв строки, потому что мы хотим отобразить фильм в том виде, в каком он был в другом текстовом файле (после преобразования продаж в строку.)

Изменила позицию, потому что изначально заказ был [Фильм, Продажи].

    for movie in movie_list:
        movie[0] = str(movie[0]) + "\n" 
        movie.insert(0, movie[1])
        movie.pop()

Потом у нас был знак "\ t", поэтому я объединил название фильма и продажи.

        string += "\t".join(movie)

    open_file.write(string)

    open_file.close()   

sort_films("top500.txt", "top500result.txt")

Мне кажется, что есть способ сортировки числа по максимуму и минимуму без необходимости изменения индекса (позиции) в списке ...

Буду признателен, если кто-нибудь сможет мне помочь.

Ответы [ 4 ]

0 голосов
/ 11 марта 2019

Как и другие пользователи, уже упомянутые, вы можете использовать сортировку в сочетании с лямбда-функцией для сортировки по второму элементу кортежа. Чтобы не разбивать ваш текстовый файл на вкладки и заменять все символы новой строки, я бы предложил использовать csv reader:

import csv
def sort_films(file_name, destination_file):
    movie_list = []
    with open(file_name, 'r') as csvfile:
        # open csv file with delimiter '\t'  to avoid splitting your string
        csv_reader = csv.reader(csvfile, delimiter='\t')
        for row in csv_reader:
            movie_list.append((row[0], int(row[1]))) # cast string to int, so it gets sorted correctly

    # sort your list by the second element of your tuple by using labda function
    movie_list_sorted = sorted(movie_list, key=lambda x: x[1], reverse=True)

    # save your sorted list into the destination_file
    with open(destination_file,'w') as f:
        for row in movie_list_sorted:
            # while saving you can use an other format by replacing \t with whatever you want
            f.write('%s\t%s\n' % (row[0], row[1]))

    sort_films('top500.txt', 'sorted.txt')
0 голосов
/ 11 марта 2019

Похоже, вы хотите иметь возможность сортировать список списков по элементу внутри внутреннего списка (продажи). Может быть, вы можете попробовать что-то вроде этого:

movie_list.sort(key=lambda x: x[1])

Это должно сделать это

0 голосов
/ 11 марта 2019

Я предлагаю вам занятия.В вашем случае вам нужен один класс с одной строкой и одним целым числом.С этого момента все пойдет легче.У вас будет только один массив объектов, тогда вы сможете играть с объектами так, как вам нравится (сортировать их, вставлять, вставлять и т. Д.).

0 голосов
/ 11 марта 2019

movie_list.sort(key=lambda x: x[1])

Как показано здесь: Сортировка кортежей по второму параметру

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...