【问题标题】:sort a list by prefered order按首选顺序对列表进行排序
【发布时间】:2017-01-08 11:33:15
【问题描述】:

是否可以根据您的首选顺序或预先确定的选择对列表进行排序并执行某些操作?

所以我有一个包含定义的文件列表,如果我重新搜索字符串并返回匹配项,我只想打印字符串 + 最高定义

我开始探索下面的想法,但我似乎无法让它只打印最高的 - 目前它打印所有 3

#!/usr/bin/python3
import re
definitions = ['1080p', '720p', 'SD'] # order (highest to lowest)
some_files = ['movie_a_1080p.mp4', 'movie_b_720p.mp4','movie_c_SD.mp4'] 

for each in some_files:
    for defs in definitions:
        match = re.search(defs, each, re.M | re.I)
        if match:
            if match.group() == '1080p':
                print('1080p', each)
                break
            else:
                if match.group() == '720p':
                    print('720p', each)
                    break
                else:
                if match.group() == 'SD':
                    print('SD', each)
                    break

任何帮助都会很棒

【问题讨论】:

  • 仅供参考:将 else: if: 替换为 elif:
  • 你希望得到什么输出? (我不知道你想做什么。)
  • 您可以定义一个自定义排序函数,使用您喜欢的任何标准对项目列表进行排序。
  • Sorting How To。 max() 和 min() 也接受关键函数参数。

标签: python python-2.7 python-3.x


【解决方案1】:

如果您只想要一个结果(最高的)并且考虑到您的列表从高到低排序,您可以在找到第一个结果后简单地返回:

import re
definitions = ['1080p', '720p', 'SD'] # order (highest to lowest)
some_files = ['movie_a_1080p.mp4', 'movie_b_720p.mp4', 'movie_c_SD.mp4']

def find():
    for each in some_files:
        for defs in definitions:
            match = re.search(defs, each, re.M | re.I)
            if match:
                return match.group(0)


print(find())

【讨论】:

    【解决方案2】:

    如果我理解你想要做什么,这应该可以:

    def best(some_files):
        for definition in ('1080p', '720p', 'SD'):
            match = next((file for file in some_files if definition in file), None)
            if match is not None:
                return match
    
    print(best(['movie_a_1080p.mp4', 'movie_b_720p.mp4', 'movie_c_SD.mp4']))  # movie_a_1080p.mp4
    print(best(['movie_b_720p.mp4', 'movie_c_SD.mp4', 'movie_a_1080p.mp4']))  # movie_a_1080p.mp4
    print(best(['movie_b_720p.mp4', 'movie_c_SD.mp4']))  # movie_b_720p.mp4
    print(best(['movie_d.mp4', 'movie_c_SD.mp4']))  # movie_c_SD.mp4
    print(best(['movie_d.mp4']))  # None
    

    您的方法的主要问题是break 只会跳出最近的循环。 @alfasin 的回答是通过 returning 从一个函数中解决这个问题。

    如果你愿意,我的答案也可以在没有函数的情况下使用,因为它只有一个循环可以跳出:

    for definition in ('1080p', '720p', 'SD'):
        match = next((file for file in some_files if definition in file), None)
        if match is not None:
            print('Found the best one: {}'.format(match))
            break
    

    【讨论】:

    • 这是完美的,完全符合我的想法,所以本质上您可以使用return 从语句的深处“突破”?我想知道我的问题是不是因为没有正确爆发。
    • 好吧,return 将从封闭函数返回。所以是的,你可以使用return 来做到这一点,但前提是你在一个函数中。
    【解决方案3】:

    由于您的definitions 是有序的,您可以只遍历列表,并在找到匹配项时返回文件。

    def best_quality(l):
        definitions = ['1080p', '720p', 'SD'] # order (highest to lowest)
        for definition in definitions:
            for file in some_files:
                if definition in file: return file
    
    some_files = ['movie_c_SD.mp4', 'movie_a_1080p.mp4', 'movie_b_720p.mp4']
    print best_quality(some_files)
    >>> movie_a_1080p.mp4       
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 2014-11-29
      • 2017-04-08
      • 2018-06-05
      • 1970-01-01
      • 2013-05-02
      • 2014-02-08
      相关资源
      最近更新 更多