我有一个这样的列表字典:
import React from 'react';
import { Switch , Route , BrowserRouter } from 'react-router-dom';
import Training from './section/training';
import Home from './homePageContent';
function App() {
return (
<BrowserRouter>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/training" component={Training} exact={true} />
</Switch>
</BrowserRouter>
);
}
export default App;
我想按a = [
{'p': 3, 'id': 'ab1'},
{'p': 10, 'id': 'ab2'},
{'p': 5, 'id': 'ab3'},
{'p': 8, 'id': 'ab4'},
{'id': 'ab5'}
]
的值对a
进行排序。如果dict没有p
,请将其放在后面。
我尝试过这种方式:
p
得到结果:
print sorted(a, key=lambda i: i.get('p'))
但想要得到的是:
[{'id': 'ab5'}, {'p': 3, 'id': 'ab1'}, {'p': 5, 'id': 'ab3'}, {'p': 8, 'id': 'ab4'}, {'p': 10, 'id': 'ab2'}]
我该怎么做才能以更简单的方式获得正确的结果?
答案 0 :(得分:4)
对于python2和python3,您都可以执行以下操作,假设p
的值丢失,我假设sys.maxsize
的值,这将确保如果我们缺少的值, p
,它们始终位于列表的末尾
import sys
a = [
{'p': 3, 'id': 'ab1'},
{'p': 10, 'id': 'ab2'},
{'p': 5, 'id': 'ab3'},
{'p': 8, 'id': 'ab4'},
{'id': 'ab5'}
]
print(sorted(a, key=lambda i: i.get('p', sys.maxsize)))
哪个会给你
[{'p': 3, 'id': 'ab1'}, {'p': 5, 'id': 'ab3'}, {'p': 8, 'id': 'ab4'}, {'p': 10, 'id': 'ab2'}, {'id': 'ab5'}]
如果与sys.maxsize
进行比较,另一种解决方法是过大的,那就是分离出没有键p
的字典,对包含键p
的其余字典进行排序,然后将其扩展为像这样附加非p
键字典。这也避免了我们为p
item.get()
提供默认值
import sys
a = [
{'p': 3, 'id': 'ab1'},
{'p': 10, 'id': 'ab2'},
{'p': 5, 'id': 'ab3'},
{'p': 8, 'id': 'ab4'},
{'id': 'ab5'}
]
#Dictionaries with key p
p_items = [item for item in a if 'p' in item.keys()]
#Dictionaries not with key p
non_p_items = [item for item in a if 'p' not in item.keys()]
#Sort the p-key dictionaries
result = sorted(p_items, key=lambda i: i.get('p'))
#Attach non p-key dictionay items at end
result.extend(non_p_items)
print(result)
答案 1 :(得分:2)
使用
a = [
{'p': 3, 'id': 'ab1'},
{'p': 10, 'id': 'ab2'},
{'p': 5, 'id': 'ab3'},
{'p': 8, 'id': 'ab4'},
{'id': 'ab5'}
]
print(sorted(a, key=lambda i: i.get('p', "NA"))) #Setting a string as a default value.
#python 3 --> https://stackoverflow.com/questions/49829732/sorting-a-mixed-list-of-ints-and-strings
print(sorted(a, key=lambda v: (isinstance(v.get('p', "NA"), str), v.get('p', "NA"))))
输出:
[{'p': 3, 'id': 'ab1'}, {'p': 5, 'id': 'ab3'}, {'p': 8, 'id': 'ab4'}, {'p': 10, 'id': 'ab2'}, {'id': 'ab5'}]
答案 2 :(得分:2)
这是我更喜欢的一个不使用lambda
的选项:
import sys
from operator import methodcaller
a = [
{'p': 3, 'id': 'ab1'},
{'p': 10, 'id': 'ab2'},
{'p': 5, 'id': 'ab3'},
{'p': 8, 'id': 'ab4'},
{'id': 'ab5'}
]
print(sorted(a, key=methodcaller('get', 'p', sys.maxsize)))