我没有数学背景,因此在简单的事情上苦苦挣扎。
from dataclasses import dataclass
@dataclass
class Country:
cc:str
name:str
countries_info = [
('DE', 'Germany'),
('EP', 'Europe'),
('US', 'United States'),
('IN', 'India')
]
countries = [Country(cc, name)
for cc, name in countries_info]
# sort based on a particular order
order = ['US', 'IN']
sorted(countries, key=lambda x: order.index(x.cc) if x.cc in order else -1)
输出:
[Country(cc='DE', name='Germany'),
Country(cc='EP', name='Europe'),
Country(cc='US', name='United States'),
Country(cc='IN', name='India')]
我想要的是
[Country(cc='US', name='United States'),
Country(cc='IN', name='India'),
Country(cc='DE', name='Germany'),
Country(cc='EP', name='Europe')]
方法仅根据顺序对国家/地区进行排序,并使其首先出现。不要触摸休息顺序
万一发生冲突,例如相同的抄送,这是可取的。
[Country(cc='US', name='United States'),
Country(cc='US', name='United States of America')
Country(cc='IN', name='Bharat'),
Country(cc='IN', name='India'),
Country(cc='DE', name='Germany'),
Country(cc='EP', name='Europe')]
表示没有关系,如果发生冲突,先到先后。
答案 0 :(得分:3)
函数key
的返回用于对列表进行排序。如果为不在-1
中的用户返回order
,则会无意中将它们推到最前面。以下代码应该起作用:
sorted(countries, key=lambda x: order.index(x.cc) if x.cc in order else len(order))
我为其他人返回了len(order)
,因为index
总是小于它。 sorted
确保排序稳定,这意味着对于相等的值,原始顺序不会更改。
编辑:这也适用于cc
中重复的order
值,因为index
将返回每个值的第一个值。因此,它们的相对顺序也将保持不变。如果需要特定的订单,只需将order.index(x.cc)
替换为另一个合适的值即可。