2009-07-06 29 views
1

好吧,我有这样的列表(只是一个数据的样本):在检查字符串或浮点数时按键排序Python列表?

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

这显然是错误的。现在,我该如何做一个这样的排序(在速度和资源/计算方面最有效率),但是当它是一个浮点数时,它会将浮点值转换为浮点数,并且当它是一个浮点数时将其保留为一个字符串字符串...可能吗?不,删除列表中的浮点值引号不是一个选项 - 我无法控制源列表,不幸的是(我知道,这将是一个简单的解决方案)。

回答

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'}] 
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()

4

分拣机,如果你不能正确地保存数据(如浮浮),像这样

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

data.sort(key=sorters[sortby]) 
+0

我喜欢这样的......从来没有想过用于排序类型的单独字典。谢谢!唯一的问题是,有50列我需要投这样的浮动,但它是迄今为止最流畅的方法... – 2009-07-06 18:21:16

+0

检查我的答案,不需要单独的字典。这是一个很好的答案,但是您必须设置50条字典...... – 2009-07-06 18:33:10