您可以編寫一個函數來分割(前綴,索引)中的名稱,並將其傳遞給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