2016-10-04 76 views
0

蟒蛇排序JSON文件我有JSON文件:使用具有值作爲字符串

ll = {"employees":[ 
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Anna", "lastName":"Smith"}, 
    {"firstName":"James", "lastName":"Bond"}, 
    {"firstName":"Celestial", "lastName":"Systems"}, 
    {"firstName":"Peter", "lastName":"Jones"} 
]} 

我想通過鍵(姓氏或名字)

我知道,我們用數字作爲使用的排序方法進行排序值,但我無法按字符串的值排序。

下面我想:

#data = json.load(file) 
new = sorted(data, key = lambda k: k['employees'].get('lastName',0)) 

,並收到錯誤:

TypeError: string indices must be integers 

回答

1

你需要給對象的列表sortedkey應的方法來獲取單個對象的價值。

In [1]: ll = {"employees": [{"name": "abc"}, {"name": "bcd"}]} 

In [2]: sorted(ll['employees'], key=lambda x: x['name']) 
Out[2]: [{'name': 'abc'}, {'name': 'bcd'}] 

正如你所看到的,我得到的僱員名單爲sorted。然後sorted在該列表的每個元素上運行lambda(因此它在{"name": "abc"}上調用x['name']並得到name。然後sorted使用鍵對列表中的元素進行排序(不管它是字符串還是數字 - 字符串也是數字 - ascii)。

當你排序列表,你可以反正它分配給ll['employees']或任何其他地方。

,猜測你的代碼(因爲你並沒有包括所有的話)我認爲你在dict調用sorted ,而不是list。另外,您使用的是錯誤的keyk不是完整對象,但s將list中的單元傳遞給排序)。

1

您可以使用list.sort方法在原地排序ll["employees"]列表。雖然您可以使用lambda推出自己的關鍵功能,但使用operator.itemgetter更清潔,更高效。

在這段代碼中,我的鑰匙函數創建lastName隨後firstName的元組,所以名單主要是由lastName排序,但人們用同樣lastNamefirstName排序。

from operator import itemgetter 
from pprint import pprint 

ll = {"employees":[ 
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Patti", "lastName":"Smith"}, 
    {"firstName":"Anna", "lastName":"Smith"}, 
    {"firstName":"James", "lastName":"Bond"}, 
    {"firstName":"Celestial", "lastName":"Systems"}, 
    {"firstName":"Peter", "lastName":"Jones"} 
]} 

ll["employees"].sort(key=itemgetter("lastName", "firstName")) 
pprint(ll) 

輸出

{'employees': [{'firstName': 'James', 'lastName': 'Bond'}, 
       {'firstName': 'John', 'lastName': 'Doe'}, 
       {'firstName': 'Peter', 'lastName': 'Jones'}, 
       {'firstName': 'Anna', 'lastName': 'Smith'}, 
       {'firstName': 'Patti', 'lastName': 'Smith'}, 
       {'firstName': 'Celestial', 'lastName': 'Systems'}]}