【问题标题】:9.3.1 self.py course - simple program for sorting file data - dosent work9.3.1 self.py 课程 - 用于排序文件数据的简单程序 - 不起作用
【发布时间】:2020-07-06 11:28:25
【问题描述】:

在包含 flawing 的 txt 文件中:

Tudo Bom;Static and Ben El Tavori;5:13;
I Gotta Feeling;The Black Eyed Peas;4:05;
Instrumental;Unknown;4:15;
Paradise;Coldplay;4:23;
Where is the love?;The Black Eyed Peas;4:13;

我正在尝试使用这个简单的程序:

def my_mp3_playlist(file_path):
    with open(file_path, 'r') as playlist_file:
        result_playlist_tuple = tuple()  # Result tuple
        playlist_splitted_lines = playlist_file.readlines()#.split("\n")  # List of songs and additional data
        len_of_playlist_splitted_lines = len(playlist_splitted_lines)  # Getting list length instead of running a
        # loop len(x) times
        playlist_items = list()
        for line in range(len_of_playlist_splitted_lines):  # Extracting list of items from list of lines
            playlist_items.append(playlist_splitted_lines[line].split(';'))
        for element in playlist_items:  # Deleting empty strings '' in playlist_lines
            del element[-1]
            del playlist_items[-1]
        max_song_length, longest_song_name = 0, ""
        max_artist_appearances, most_appearing_artist = 0, ""
        for i in playlist_items:
            # Getting max song length
            curr_float_song_length = float(i[-1].replace(':', '.'))
            if curr_float_song_length > max_song_length:  # Getting max song length
                max_song_length = curr_float_song_length
                longest_song_name = i[0]
            if i.count(i[1]) > max_artist_appearances:  # Getting Most appearing song
                max_artist_appearances = playlist_items.count(i)
                most_appearing_artist = i[1]
        result_playlist_tuple += (longest_song_name, len(playlist_items), most_appearing_artist)
        return result_playlist_tuple
 
 
def main():
    file_path = input("Enter file path: ")
    print(my_mp3_playlist(file_path))
 
 
if __name__ == '__main__':
    main()

      

程序需要返回元组:(str:longest_song, int:playlist_items(lines), str:most_appearing_artist)

我想要的输出:("Tudo Bom", 5, "The black Eyed Peas")

我得到:('Tudo Bom', 3, 'Static and Ben El Tavori')*

请帮忙, 提前谢谢, 艾尔。

【问题讨论】:

    标签: python


    【解决方案1】:

    正如@JMCampos 已经回答的那样,对于播放列表中的每个元素,您都删除列表中的最新元素:

    for element in playlist_items:
        del element[-1]
        del playlist_items[-1]
    

    因此,您的项目列表减半,仅包含 3 行而不是 5 行。您需要像这样从循环中删除此行:

    del playlist_items[-1]
    for element in playlist_items:
        del element[-1]
    

    但更多 pythonic 方法可以确保您拥有非空数据,例如使用 list comprehensions

    playlist_items = [item for item in playlist_items if item]
    

    第三个结果参数是出现次数最多的艺术家。您尝试计算始终为 1 的一行中的艺术家出现次数。在检查之后,您计算出的最大出现次数为列表中整行的出现次数(也始终为 1,因为您文件中没有重复的行):

    if i.count(i[1]) > max_artist_appearances:
        max_artist_appearances = playlist_items.count(i)
    

    有几种方法可以从列表中获取最频繁的值。例如,您可以在字典中收集您的艺术家及其歌曲数量,然后获取数量最多的艺术家:

    artists = {}
    for item in playlist_items:
        artist = item[1]
        if artist not in artists:
            artists[artist] = 0
        artists[artist] += 1
    most_appearing_artist, number_of_appearances = max(artists.items(), key=lambda x: x[1])
    

    【讨论】:

      【解决方案2】:

      我认为这可能与这条线有关

              del playlist_items[-1]
      

      您可能正在尝试删除最后一行,但您正在删除一行,即仍然在 playlist_items 列表中的每一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 2011-08-12
        相关资源
        最近更新 更多