用数字后缀排序不同长度的字符串

2024-09-29 21:25:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表列表,基于每个列表的第一个元素,我要对列表进行排序。这些指标的样本:

  vlan1                    
  usb0                   
  eth1                     
  vlan4                   
  vlan20  

如果它们的长度与vlanX相同,我会做如下操作:

^{pr2}$

我想以VLAN优先的方式对它们进行排序,然后其他的都无关紧要。如果它们是分类的,但不是必需的(我认为不会有超过一个usb或eth)。在

  vlan1
  vlan4 
  vlan20                    
  usb0                    
  eth1                                 

这是简单的调整我的lambda来做还是我应该尝试做一个函数来做它?在

我试过这样做,但很明显,在对vlan进行排序时,它不会影响usb和eth在错误的位置。在

table_data = sorted(table_data, key = lambda x: x = True if "vlan" not in x[0] else int(x[0][4:]))

编辑:那条线不符合我的要求?这将对vlan元素之间的usb和eth元素进行排序,这不是我想要的。在


Tags: lambda元素列表data排序tableeth1指标
1条回答
网友
1楼 · 发布于 2024-09-29 21:25:15

您可以编写一个函数来拆分名称(prefix,index),并将其传递给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']

如果希望按前缀降序,按索引升序,则函数会将索引转换为负数,以便在列表反转时顺序正确。在

[更新]

No, the OP does not want the order to be descending by prefix. The OP wants 'vlan' to be sorted first, regardless. That happens to fit with descending alphabetic sorting, but not if a 'wlan' key was ever added to the data. – Martijn Pieters

很公平。在

^{pr2}$

编一个口述怎么样?在

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

相关问题 更多 >

    热门问题