除了特殊情况

时间:2015-05-13 21:54:29

标签: python list sorting tuples

嘿,我有一个类似于:

的元组列表

[(5, "dummmy_string1"), (6, "dummy_string2"), (3, "special_string")]

我想按元组的第一个值的升序排序,除了字符串等于special_string的情况。无论元组中的整数值如何,我都希望special_string最后排序。

我现在有这个似乎不起作用的事情:

sorted(li, key=lambda x: (x.string_value == "special_string", x.int_value))

我可以轻松找到所有具有special_string的元组,从列表中删除它们,对列表进行排序,然后将它们追加到最后,但寻找更清晰的解决方案。

编辑:

我犯了一个愚蠢的错误并意识到我的解决方案确实有效...... =)

3 个答案:

答案 0 :(得分:0)

li = [(5, "dummmy_string1"), (6, "dummy_string2"), (3, "special_string")]
print sorted(li,key=lambda x:(x[-1]=="special_string",)+x)

应该可以正常工作......不知道你x.string_value是什么(除了AttributeError之外)

如果有多个special_string,它会按照与其他字符串相同的顺序对它们进行排序(即标准的Left2Right元组排序)

答案 1 :(得分:0)

由于排序稳定,您只需对列表进行两次排序即可。一次为第一个键,然后第二次为特殊情况

In [2]: li = [(5, "dummmy_string1"), (6, "dummy_string2"), (3, "special_string")]

In [3]: sorted(li, key = lambda x : x[0])
Out[3]: [(3, 'special_string'), (5, 'dummmy_string1'), (6, 'dummy_string2')]

In [4]: sorted(li, key = lambda x : x[1] == "special_string")
Out[4]: [(5, 'dummmy_string1'), (6, 'dummy_string2'), (3, 'special_string')]

答案 2 :(得分:0)

问题中公布的解决方案确实有效:

sorted(li, key=lambda x: (x.string_value == "special_string", x.int_value))