【问题标题】:python, sorting a list by a key that's a substring of each elementpython,按每个元素的子字符串的键对列表进行排序
【发布时间】:2010-10-01 05:32:47
【问题描述】:

程序的一部分构建了这个列表,

[u'1 x Affinity for war', u'1 x Intellect', u'2 x Charisma', u'2 x Perception', u'3 x Population growth', u'4 x Affinity for the land', u'5 x Morale']

我目前正在尝试按进化名称而不是数字的字母顺序对其进行排序。有没有什么办法可以做到这一点,而不仅仅是改变两件事在列表中出现的顺序(如'intellect x 1)?

【问题讨论】:

  • 附带说明,如果将其转换为元组列表而不是 unicode 字符串,通常会更方便;特别是命名元组可能真的有助于代码的可读性。

标签: python list sorting


【解决方案1】:

你必须从字符串中获取“key”。

def myKeyFunc( aString ):
    stuff, x, label = aString.partition(' x ')
    return label

aList.sort( key= myKeyFunc )

【讨论】:

  • 准确而准确地说。那只是“东西”。根据同义词库的“杂项未指定对象”。字符串的分区方法返回三个结果。其中之一就是永远不会再使用的“东西”。
  • 在这种情况下,“ x ”前面的东西可能是有意义的,但我们无法从问题中看出它是什么或它意味着什么。由于问题含糊不清,我们只能称其为“东西”。
  • 你知道你可以在元组中你不会使用的部分使用下划线:_,_,label = aString.partition(' x ')
  • @Amoss:有些人不喜欢它,更喜欢“真实的”变量名。有些人更喜欢_
【解决方案2】:

怎么样:

lst.sort(key=lamdba s: s.split(' x ')[1])

【讨论】:

    【解决方案3】:

    不知道您的项目是否标准化为 1 个数字、1 个空格、1 个“x”、1 个空格、多个单词我写了这个:

    mylist = [u'1 x 战争亲和力', u'1 x 智力', u'2 x 魅力', u'2 x 感知', u'3 x 人口增长', u'4 x 亲和力土地',你'5 x士气']
    定义排序(a,b):
      返回 cmp(" ".join(a.split()[2:]), " ".join(b.split()[2:]))
    
    mylist.sort(排序)
    

    您可以在 sort 方法中编辑解析,但您可能明白了。

    干杯, 帕特里克

    【讨论】:

    • 尽可能使用 key= 比使用自定义比较器更好,因为自定义比较器必须调用 n*log n 次,但 key 函数只需要 n 次调用。
    • 不知道。感谢递归!
    【解决方案4】:

    为此,您需要实现自定义比较:

    def myCompare(x, y):
       x_name = " ".join(x.split()[2:])
       y_name = " ".join(y.split()[2:])
       return cmp(x_name, y_name)
    

    然后您使用该比较定义作为排序函数的输入:

    myList.sort(myCompare)
    

    【讨论】:

      【解决方案5】:

      当您尝试对本质上是自定义数据的内容进行排序时,我会使用自定义排序。

      Merge sort
      Bubble sort
      Quicksort

      【讨论】:

      • 不,您想使用带有自定义比较器的内置排序方法。
      • S.Lott 就是这么做的吗?如果没有,你能分享一个代码示例吗?
      • 这是一个糟糕的建议。他试图对某些东西进行排序,而不是实现排序。有一个很大的不同。一个有用,一个浪费时间。
      • 是的,绝对不要通过编写自定义排序来重新发明轮子。非常浪费时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多