【问题标题】:Sorting lists based on conditions根据条件对列表进行排序
【发布时间】:2014-02-19 20:17:55
【问题描述】:

我有如下列表:

['pt=media:song', 'c=100','class=song', 'object=mp3']
['class=text','pt=transaction:email','c=90','object=email']
['c=97','category=where','pt=text:where','class:question']
['object:mp4','class=movie', 'pt=media:movie','c=56']

我想对它们进行排序,这样我总是让从 'c=' 开始的字段首先出现,"pt=" 出现在第二个,其余的按字母顺序排序。

所以结果是:

['c=100','pt=media:song','class=song', 'object=mp3']
['c=90','pt=transaction:email','class=text', 'object=email']
['c=97','pt=text:where','category=where','class:question'] 
['c=56','pt=media:movie','class=movie','object:mp4']

我该怎么做?

【问题讨论】:

标签: python list sorting


【解决方案1】:

这将使您的两个特色菜按正确的顺序排列,然后按字母顺序排列:

In [212]: l = ['object:mp4','class=movie', 'pt=media:movie','c=56']

In [213]: specials = [i for i in l if i.startswith("c=") or i.startswith("pt=")]

In [214]: sorted(specials) + sorted(set(l).difference(specials))
Out[214]: ['c=56', 'pt=media:movie', 'class=movie', 'object:mp4']

【讨论】:

    【解决方案2】:

    此函数将以指定字符串开头的item 放在开头,然后使用sorted 将其余部分按正确的顺序排列:

    def rearrange(lst, s):
        for index, item in enumerate(lst):
            if item.startswith(s[0]):
                if len(s) == 1:
                    return [item] + sorted(lst[:index] + lst[index+1:])
                else:
                    return [item] + rearrange(lst[:index] + lst[index+1:], s[1:])
    

    例如:

    >>> rearrange(['object:mp4','class=movie', 'pt=media:movie','c=56'], 
                  ("c=", "pt="))
    ['c=56', 'pt=media:movie', 'class=movie', 'object:mp4']
    

    如果没有项目以适当的字符串开头,它将return None

    【讨论】:

      【解决方案3】:

      使用tuple 键排序,其前两个元素检查c=pt=

      .sort(key=lambda x:(not x.startswith('c='), not x.startswith('pt='), x))
      

      【讨论】:

        猜你喜欢
        • 2017-02-28
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        • 1970-01-01
        • 2013-09-30
        相关资源
        最近更新 更多