按属性对对象列表进行排序,但属性包含名称、数字和下划线PYTHON

qyyhg6bp  于 2023-01-06  发布在  Python
关注(0)|答案(1)|浏览(111)

用户在这里问了这个问题,但它是关于一个字符串列表的。我有一个类列表,想修改这个问题的答案:
原螺纹
具体地说,这段代码完全按照我想要的方式工作,但我需要修改它,使其与类属性一起工作,而不仅仅是一个字符串列表:

import re
## ref: https://blog.codinghorror.com/sorting-for-humans-natural-sort-order/
def sort_nicely( l ):
    """ Sort the given list in the way that humans expect.
    """
    convert = lambda text: int(text) if text.isdigit() else text
    alphanum_key = lambda key: [ convert(c.replace("_","")) for c in re.split('([0-9]+)', key) ]
    l.sort( key=alphanum_key )
    return print(l)
    ```

我试过用很多方法修改lambda表达式,但是无论我怎么修改它,我总是得到下面的错误:
应为字符串或类似字节的对象
这是我目前所处的位置,这是行不通的。任何见解都将非常感谢

import re

class ContainerTest:
    def __init__( self ):
        self.name = ''
        
def sort_nicely( l ):
    """ Sort the given list in the way that humans expect.
    """
    convert = lambda x: x.name, lambda text: int( x ) if x.isdigit() else x
    alphanum_key = lambda key: [ convert( c.replace( "_", "" ) ) for c in re.split( '([0-9]+)', key ) ]
    l.sort( key=alphanum_key )
    return print( l )

items = []

for i in range( 0, 2 ):
    item = ContainerTest()
    item.name = 'test_128_0' + str( i + 1 )
    items.append( item )
for i in range( 0, 2 ):
    item = ContainerTest()
    item.name = 'test_64_0' + str( i + 1 )
    items.append( item )

sort_nicely( items )
y1aodyip

y1aodyip1#

如果你想按名称对ContainerTest示例进行排序(使用为字符串排序而开发的逻辑),你只需要让key函数从它所传递的对象中获取属性,重要的变量是传递给alphanum_keykey参数,它将是列表中的项(在本例中是类的示例)。
试试看:

alphanum_key = lambda key: [convert( c.replace("_", ""))
                            for c in re.split('([0-9]+)', key.name)]

修改是在行尾,我们在key.name上而不是key上进行正则表达式拆分。

相关问题