用户在这里问了这个问题,但它是关于一个字符串列表的。我有一个类列表,想修改这个问题的答案:
原螺纹
具体地说,这段代码完全按照我想要的方式工作,但我需要修改它,使其与类属性一起工作,而不仅仅是一个字符串列表:
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 )
1条答案
按热度按时间y1aodyip1#
如果你想按名称对
ContainerTest
示例进行排序(使用为字符串排序而开发的逻辑),你只需要让key
函数从它所传递的对象中获取属性,重要的变量是传递给alphanum_key
的key
参数,它将是列表中的项(在本例中是类的示例)。试试看:
修改是在行尾,我们在
key.name
上而不是key
上进行正则表达式拆分。