Python itemgetter根据值字符串的中间值对dict进行排序

问题描述 投票:0回答:2

我创建了一本字典:

listing = {'2': 'Mary Lejam', '3': 'Zachery Aka', '1': 'John Joer', '4': 'Joe Private', '10': 'Carla Chris'}

我正在写一个简单的程序,根据键(它是id)对名称进行排序,并根据姓氏排序我用字典的键找出id。但现在我正试图找到一种方法来排序姓氏。

  1. 如果我做listing.values(),它会用名字的第一个字母排序
  2. 如果我使用itemgetter,我只能放一个它将排序的索引。

我尝试导入re,例如itemgetter(re.match(regex)),给我错误我想知道是否可以使用itemgetter并在其中写一些正则表达式忽略姓氏之前的所有内容。它基本上会忽略空间之前的一切。

LastName = sorted(listing.values(), key=itemgetter(Some Regex))
python
2个回答
0
投票

itemgetter在这里不是特别有用,因为你需要对返回值做进一步的工作,而Python没有任何方法可以直接编写函数。

sorted(listing.items(), key=lambda x: x[1].split()[1])

如果有功能组合,比如因为你使用的是toolz包,你可能会写

from toolz import compose

# Equivalent functions, but names reflect different *purposes*
get_name = get_last_name = itemgetter(1)
split_name = methodcaller('split')

sorted(listing.items(), key=compose(get_last_name, split_name, get_name))

0
投票

一种方法是拆分和重组:

listing = {'2': 'Mary Lejam', '3': 'Zachery Aka', '1': 'John Joer', '4': 'Joe Private', '10': 'Carla Chris'}

import operator
sorted(({k:[v.split(' ')[1], v.split(' ')[0]] for k,v in listing.items()}).items(), key=operator.itemgetter(1))

[('3', ['Aka', 'Zachery']),
 ('10', ['Chris', 'Carla']),
 ('1', ['Joer', 'John']),
 ('2', ['Lejam', 'Mary']),
 ('4', ['Private', 'Joe'])]

listing = {i[0]:' '.join([i[1][1], i[1][0]]) for i in temp}

{'3': 'Zachery Aka',
 '10': 'Carla Chris',
 '1': 'John Joer',
 '2': 'Mary Lejam',
 '4': 'Joe Private'}

但总的来说Python dictionaries are unsorted,如果你真的需要一个排序的数据结构,你不应该使用dict。

© www.soinside.com 2019 - 2024. All rights reserved.