按键排序Python列表...同时检查字符串OR浮点数?

时间:2009-07-06 18:00:59

标签: python list sorting

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

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”是任何浮动值(RANK或NUM或任何其他)时,按字母顺序再次排序,而不是数字,所以我的排序列表看起来像这样:

0.441 101.404 107.558 107.558 108.48 108.945 11.195 12.143 12.801 131.73

这显然是错误的。

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

3 个答案:

答案 0 :(得分:7)

如果你想要一个可以作为参数传递给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'}]

答案 1 :(得分:4)

如果你无法正确保存数据(浮动为浮动),就像这样

sorters = { "NAME" : itemgetter("NAME"), 
            "RANK" : lambda x: float(x["RANK"]),
            "NUM" : lambda x: float(x["NUM"])
}

data.sort(key=sorters[sortby])

答案 2 :(得分:0)

比传递字段名称稍微冗长,但这是一个选项:

sort_by_name = lambda x: x['name']
sort_by_rank = lambda x: float(x['RANK'])
# etc...

data.sort(key=sort_by_rank)

如果数据比您发布的数据密集得多,您可能需要一个单独的字典映射字段名称到数据类型,然后是工厂函数来生成适合key参数的分拣机list.sort() 1}}