基于另一个列表索引的订单列表

时间:2019-05-31 10:33:12

标签: python python-3.x

我没有数学背景,因此在简单的事情上苦苦挣扎。

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')]

表示没有关系,如果发生冲突,先到先后。

1 个答案:

答案 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)替换为另一个合适的值即可。