Skip to main content
 首页 » 编程设计

python之按键对 Python 列表进行排序...同时检查字符串或 float

2025年05月04日19三少

好的,我有一个这样的列表(只是数据样本):

data = {"NAME": "James", "RANK": "3.0", "NUM": "27.5" ... } 

现在,如果我运行这样的程序:

sortby = "NAME" //this gets passed to the function, hence why I am using a variable sortby instead 
data.sort(key=itemgetter(sortby)) 

我将所有字符串正确排序 - 按字母顺序排列。

但是,当“sortby”是任何 float 值(RANK 或 NUM 或任何其他)时,排序将再次按字母顺序而不是数字顺序进行,所以我的排序列表看起来像这样:

0.441 101.404 107.558 107.558 108.48 108.945 11.195 12.143 12.801 131.73

这显然是错误的。

现在,我怎样才能做这样的排序(在速度和资源/计算方面最有效)但是当它是一个 float 时它以某种方式将值转换为 float ,而当它是一个字符串时将它保留为一个字符串... 可能的?不,从列表中的浮点值中删除引号不是一个选项 - 不幸的是,我无法控制源列表(而且我知道,这本来是一个简单的解决方案)。

请您参考如下方法:

如果您想要一个可以作为参数传递给 sort(key=XXX) 的通用函数,那么这里有一个带有测试的候选函数:

DATA = [ 
    { 'name' : 'A', 'value' : '10.0' }, 
    { 'name' : 'B', 'value' : '2.0' }, 
] 
 
def get_attr(name): 
    def inner_func(o): 
        try: 
            rv = float(o[name]) 
        except ValueError: 
            rv = o[name] 
        return rv 
    return inner_func 
 
for attrname in ('name', 'value'): 
    DATA.sort(key=get_attr(attrname)) 
    print "%r-sorted: %s" % (attrname, DATA) 

当你运行上面的脚本时,你会得到:

'name'-sorted: [{'name': 'A', 'value': '10.0'}, {'name': 'B', 'value': '2.0'}] 
'value'-sorted: [{'name': 'B', 'value': '2.0'}, {'name': 'A', 'value': '10.0'}]