【问题标题】:How to find highest number from list of strings with python如何使用python从字符串列表中查找最高数字
【发布时间】:2023-03-17 15:52:01
【问题描述】:

我正在尝试修复我的 python 脚本,该脚本会从我的磁盘中扫描现有动漫节目,然后创建一个列表,其中仅包含最新剧集,包括节目名称。

然后我使用该列表抓取互联网以查看是否有新剧集可供观看。

一段时间以来,我的脚本一直在运行,但是当集数达到 99 或 100 时,它遇到了问题,具体取决于您如何看待它。

下面是我用来对动漫节目进行分组并获取每个节目的最新剧集编号的一段代码。

下面是代码中使用的 sorted_list 的展示片段:

sorted_list= [
'Bakumatsu Crisis - 11'
'Bakumatsu Crisis - 12'
'Black Clover - 100'
'Black Clover - 99'
'Black Clover - 98'
'Black Clover - 97'
 ]
    latest_list = []
    get_series = itertools.groupby(sorted_list, lambda x: x.split('-')[0])
    find_max = [(series, max(list(episode), key=lambda x: x.split('-'))) for series, episode in get_series]
    for line in find_max:
        latest_list.append(line[1])
    return latest_list

返回的“latest_list”如下所示:

latest_list= [
'Bakumatsu Crisis - 12'
'Black Clover - 99'
 ]

当我期望它返回时:

 latest_list= [
'Bakumatsu Crisis - 12'
'Black Clover - 100'
 ]

我无法弄清楚我自己。我尝试使用 pythonsorted_list.sort() 对“sorted_list”进行排序,但它没有做任何事情。

【问题讨论】:

    标签: list python-3.6


    【解决方案1】:

    首先,您需要按' - ' 分割,而不是'-'(因为这是将系列名称与字符串中的剧集编号分开的原因),并且您需要按int(x.split(' - ')[1]) 排序,否则它将排序剧集编号是字符串而不是数字(这就是 '99' > '100' 的原因):

    get_series = itertools.groupby(sorted_list, lambda x: ' - '.join(x.split(' - ')[:-1]))
    find_max = [(series, max(episode, key=lambda x: int(x.split(' - ')[-1]))) for series, episode in get_series]
    for line in find_max:
        latest_list.append(line[1])
    print(latest_list)
    

    输出:

    ['Bakumatsu Crisis - 12', 'Black Clover - 100']
    

    但是,我建议您要么使用其他数据结构(例如 dict),要么定义自己的类来更好地组织和操作数据,而不是像这样让事情变得凌乱。

    【讨论】:

    • 你的建议奏效了,但是我注意到我有一些系列名称中添加了 ' - ' 所以不得不将 python [1] 更改为 [-1] 所以它将最后一个索引作为整数,而不是第二个索引,所以它变成了:find_max = [(series, max(list(episode), key=lambda x: int(x.split(' - ')[-1]))) for series, episode in get_series] 是的,你是对的,我应该使用字典,但是我必须在程序中进一步更改很多代码才能进行更改,所以我宁愿不这样做,至少暂时。
    • @Nanoni 在这种情况下,您还需要将组键更改为' - '.join(x.split(' - ')[:-1])
    【解决方案2】:

    您最好停止使用列表,而开始使用字典。字典或多或少是python内部的json,您可以将值分配给其中的名称并调用这些值。 因此,对于这种情况,您应该这样做:

    anime_dict = {
        'Black Clover' : 100,
        'Bakumatsu Crisis' : 12
        }
    
    sorted_dict = sorted(anime_dict.items(), key=lambda kv: kv[1])
    

    这会返回

    [('Bakumatsu Crisis', 12), ('Black Clover', 100)]
    

    那么,如果您想以存储在此处的方式打印它们,只需执行以下操作:

    sorted_dict=dict(sorted_dict) # forgot to mention that prior to this being called, it will be a tuple, my bad
    for anime in sorted_dict:
        print(anime, '-', sorted_dict[anime])
    

    顺便说一句:后退,远离天空,黑色漫游者

    【讨论】:

    • 那么你建议我如何从文件列表中创建一个字典?我尝试了以下方法:python sorted_list.update({ep_name: ep_num}) 到第一个 for 循环的末尾,但它不能正常工作,它产生“Black Clover”:'99',而不是“Black Clover”:'100'。
    • 你可以做 sorted_list[ep_name] = ep_num 并且会正确追加它
    • 再次返回 'Black Clover': '99' 而不是 100。
    • 所以该功能现在更简洁了,但它与我来这里时遇到的完全相同的问题,如果存在 100 ep,则无法识别。这是到目前为止的代码sorted_dict = {} for line in filelist: line = line.split() ep_num = line[-2] ep_string = line[1:-3] ep_name = " ".join(str(x) for x in ep_string) sorted_dict[ep_name] = ep_num sorted_list = [] for anime in sorted_dict: sorted_list.append(anime + ' - ' + sorted_dict[anime]) return sorted_list
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多