Cra*_*erb 1 python sorting list
好的,我有一个这样的列表(只是一个数据样本):
data = {"NAME": "James", "RANK": "3.0", "NUM": "27.5" ... }
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行这样的事情:
sortby = "NAME" //this gets passed to the function, hence why I am using a variable sortby instead
data.sort(key=itemgetter(sortby))
Run Code Online (Sandbox Code Playgroud)
我按字母顺序排列所有字符串.
但是,当"sortby"是任何浮动值(RANK或NUM或任何其他)时,按字母顺序再次排序,而不是数字,所以我的排序列表看起来像这样:
0.441 101.404 107.558 107.558 108.48 108.945 11.195 12.143 12.801 131.73
这显然是错的.
现在,我怎么能做到这样的排序(在速度和资源/计算方面最有效),但是当它是一个浮点数时,它会以某种方式抛出值浮动,当它是一个字符串时将它保留为字符串......可能?不,从列表中的浮点值中删除引号不是一个选项 - 不幸的是我无法控制源列表(我知道,这将是一个简单的解决方案).
如果你想要一个可以作为参数传递的通用函数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)
Run Code Online (Sandbox Code Playgroud)
当您运行上面的脚本时,您会得到:
'name'-sorted: [{'name': 'A', 'value': '10.0'}, {'name': 'B', 'value': '2.0'}]
'value'-sorted: [{'name': 'B', 'value': '2.0'}, {'name': 'A', 'value': '10.0'}]
Run Code Online (Sandbox Code Playgroud)