按值对词典列表进行排序,但缺少某些项目

时间:2019-04-30 10:15:14

标签: python list sorting dictionary

我有一个这样的列表字典:

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

我该怎么做才能以更简单的方式获得正确的结果?

3 个答案:

答案 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)))