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

时间:2010-03-22 18:26:31

标签: python sorting tuples case-insensitive

如何在没有对案例敏感的情况下高效轻松地对元组列表进行排序?

例如:

[('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 个答案:

答案 0 :(得分:10)

您可以使用sort的{​​{1}}参数来定义您希望如何考虑每个元素的排序:

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

答案 1 :(得分:2)

list_of_tuples.sort(key=lambda t : tuple(s.lower() if isinstance(s,basestring) else s for s in t))

答案 2 :(得分:0)

这样的事情应该有效:

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的可选比较函数参数要快一点。

答案 3 :(得分:0)

这是一个使用Python维基文章(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]

答案 4 :(得分:0)

Paul McGuires的简化版本有效:

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

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