您可以编写一个函数来分割(前缀,索引)中的名称,并将其传递给key
参数。
import re
table_data = ["vlan1", "usb0", "eth1", "vlan4", "vlan20"]
def get_key(v):
prefix, index = re.match(r'([a-z]+)(\d+)', v).groups()
return prefix, -int(index)
>>> sorted(table_data, key=get_key, reverse=True)
['vlan1', 'vlan4', 'vlan20', 'usb0', 'eth1']
你想要的顺序由前缀和升序降序按索引,函数索引转换为负,所以当列表被颠倒的顺序是正确的。
[更新]
没有,OP不希望为了通过前缀下降。无论如何,OP都希望首先对“vlan”进行排序。这恰好符合降序字母排序,但如果将“wlan”键添加到数据中则不会。 - Martijn Pieters
不够公平。
def get_key(v):
prefix, index = re.match(r'([a-z]+)(\d+)', v).groups()
if prefix == 'vlan':
prefix = '~'
return prefix, -int(index)
>>> table_data = ["vlan1", "usb0", "eth1", "vlan4", "vlan20", "wlan0"]
>>> sorted(table_data, key=get_key, reverse=True)
['vlan1', 'vlan4', 'vlan20', 'wlan0', 'usb0', 'eth1']
如何组装的字典?
interfaces = {}
for iface in table_data:
prefix, index = re.match(r'([a-z]+)(\d+)', iface).groups()
interfaces.setdefault(prefix, []).append(iface)
for v in interfaces.values():
v.sort(key=lambda x: int(re.search(r'\d+', x).group(0)))
>>> interfaces
{'eth': ['eth1'],
'usb': ['usb0'],
'vlan': ['vlan1', 'vlan4', 'vlan20'],
'wlan': ['wlan0']}
>>> interface_types = interfaces.keys()
>>> interface_types
['eth', 'vlan', 'wlan', 'usb']
>>> interfaces['vlan']
['vlan1', 'vlan4', 'vlan20']
@Martijn彼得斯我认为示例答案会以人类可读的方式排序所有元素,这不是我想要的。这仍然使它足够类似于关闭。我更喜欢分组相似的元素,然后对其相关的数字进行排序。 – Paul
'table_data.sort(key = lambda x:(x [:4]!='vlan',int(x [4:] or 0)))' –
@gnibbler我试过了,但没有排序所有vlans正确。当我尝试这些数字时,它给了我1,15,20,3。 – Paul