嘿,我有一个类似于:
的元组列表 [(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
的元组,从列表中删除它们,对列表进行排序,然后将它们追加到最后,但寻找更清晰的解决方案。
编辑:
我犯了一个愚蠢的错误并意识到我的解决方案确实有效...... =)
答案 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))