代码之家  ›  专栏  ›  技术社区  ›  David Underhill

排序不区分大小写的元组列表

  •  5
  • David Underhill  · 技术社区  · 14 年前

    如何高效轻松地对元组列表进行排序 没有 对案件敏感?

    例如:

    [('a', 'c'), ('A', 'b'), ('a', 'a'), ('a', 5)]
    

    排序后应如下所示:

    [('a', 5), ('a', 'a'), ('A', 'b'), ('a', 'c')]
    

    常规词典排序将“a”放在“a”之前,并生成:

    [('A', 'b'), ('a', 5), ('a', 'a'), ('a', 'c')]
    
    5 回复  |  直到 14 年前
        1
  •  10
  •   unutbu    14 年前

    你可以用 sort key 用于定义如何看待每个元素的排序的参数:

    def lower_if_possible(x):
        try:
            return x.lower()
        except AttributeError:
            return x
    
    L=[('a', 'c'), ('A', 'b'), ('a', 'a'), ('a', 5)]
    
    L.sort(key=lambda x: map(lower_if_possible,x))
    print(L)
    

    http://wiki.python.org/moin/HowTo/Sorting 了解如何使用 钥匙 .

        2
  •  2
  •   PaulMcG    14 年前
    list_of_tuples.sort(key=lambda t : tuple(s.lower() if isinstance(s,basestring) else s for s in t))
    
        3
  •  0
  •   user25148    14 年前

    这样的方法应该有效:

    def sort_ci(items):
        def sort_tuple(tuple):
            return ([lower(x) for x in tuple],) + tuple
        temp = [sort_tuple(tuple) for tuple in items]
        temp.sort()
        return [tuple[1:] for tuple in temp]
    

    换句话说,创建一个新的列表,其中每个项都是一个由旧元组组成的元组,以小写的每个项作为相同元组的前缀。然后分类。

    这比使用要快一点 sort 的可选比较函数参数(如果列表很长)。

        4
  •  0
  •   David Underhill    14 年前

    下面是一个解决方案,它使用了Pythonwiki文章的“按键排序”部分中说明的装饰器思想。( http://wiki.python.org/moin/HowTo/Sorting/ )

    # Create a list of new tuples whose first element is lowercase
    # version of the original tuple.  I use an extra function to
    # handle tuples which contain non-strings.
    f = lambda x : x.lower() if type(x)==str else x
    deco = [(tuple(f(e) for e in t), t) for t in ex]
    
    # now we can directly sort deco and get the result we want
    deco.sort()
    
    # extract the original tuples in the case-insensitive sorted order
    out = [t for _,t in deco]
    
        5
  •  0
  •   T1ckL35    14 年前

    保罗·麦奎尔作品的简化版本:

    list_of_tuples.sort(key=lambda t : tuple(t[0].lower()))
    

    (其中t[0]引用要使用的元组元素,在本例中是第一个)