按成员排序dict

时间:2015-04-03 11:18:59

标签: python sorting

我有一个像

这样的字典列表
array[0] = {'id' : 123 , 'number' : 345 , 'zipcode' : 67890}
array[1] ...

我用过

array.sort(key=lambda k: k['number'] , reverse=True)

之前

array.sort(key= operator.itemgetter('number') , reverse=True)

排序有效但是,当我编号为

3 34 3456 2 23 234556

排序不会改变顺序原因3(如果我理解处理)等于3(4)和3(3456)等...

是否有任何想法可以改进密钥或类似的东西以使其更好?

5 个答案:

答案 0 :(得分:0)

您可以使用sorted而不是sort,t最常见的是将列表传递给sorted()函数,但实际上它可以将任何类型的可迭代集合作为输入。
sorted()函数可以通过可选参数自定义。 sorted()可选参数reverse = True,例如sorted(list,reverse = True),使其向后排序。 你尝试排序
print sorted(array, key=lambda k: k['number'] , reverse=True)
实施例。
strs = ['aa', 'BB', 'zz', 'CC'] print sorted(strs) ## ['BB', 'CC', 'aa', 'zz'] (case sensitive) print sorted(strs, reverse=True) ## ['zz', 'aa', 'CC', 'BB']

答案 1 :(得分:0)

您需要将字符串作为要转换为int的值:

array.sort(key=lambda k: int(k['number']) , reverse=True)

排序数字字符串"2" > "100"时。 Python逐字符地比较两个字符串,第一个更高的字符将被视为更大,或者如果所有字符都相同,直到较短字符串的长度,则较长的字符串将被视为更大。

您可以使用一个简单示例来查看行为:

In [1]: a = "123"   
In [2]: b = "2"  
In [3]: a > b
Out[3]: False   
In [4]: int(a) > int(b)
Out[4]: True

答案 2 :(得分:-1)

尝试:

print sorted(array, key=lambda k: k['number'] , reverse=True)

答案 3 :(得分:-1)

我无法重现您遇到的问题,这是我的IDLE会话输出(Python 3,Windows 64位):

>>> array = []
>>> array.append({'id' : 123 , 'number' : 345 , 'zipcode' : 67890})
>>> array.append({'id' : 123 , 'number' : 3 , 'zipcode' : 67890})
>>> array.append({'id' : 123 , 'number' : 34 , 'zipcode' : 67890})
>>> array.append({'id' : 123 , 'number' : 3456 , 'zipcode' : 67890})
>>> array.sort(key=lambda item: item['number'], reverse=True)
>>> array
[{'zipcode': 67890, 'number': 3456, 'id': 123}, {'zipcode': 67890, 'number': 345, 'id': 123}, {'zipcode': 67890, 'number': 34, 'id': 123}, {'zipcode': 67890, 'number': 3, 'id': 123}]

你可以发布你的代码吗?

答案 4 :(得分:-1)

对我来说很好:

In [39]: x
Out[39]: 
[{'id': 123, 'number': 345, 'zipcode': 67890},
{'id': 12, 'number': 35, 'zipcode': 6789},
{'id': 1211, 'number': 15, 'zipcode': 1789},
{'id': 90103, 'number': 1045, 'zipcode': 79890}]

In [40]: sorted(x, key=lambda k:k['number'], reverse=True)
Out[40]: 
[{'id': 90103, 'number': 1045, 'zipcode': 79890},
{'id': 123, 'number': 345, 'zipcode': 67890},
{'id': 12, 'number': 35, 'zipcode': 6789},
{'id': 1211, 'number': 15, 'zipcode': 1789}]

In [41]: x.sort(key=lambda k:k['number'], reverse=True)

In [42]: x
Out[42]: 
[{'id': 90103, 'number': 1045, 'zipcode': 79890},
{'id': 123, 'number': 345, 'zipcode': 67890},
{'id': 12, 'number': 35, 'zipcode': 6789},
{'id': 1211, 'number': 15, 'zipcode': 1789}]