首页 > 解决方案 > 在列表的开头和结尾强制执行项目

问题描述

我怎样才能修改这个列表,让所有的都p's出现在开头、q's结尾,并且中间的值按字母顺序排序?

l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

所以我想拥有:

['p','p','a','b','c','d','f','g','n','t','z','q','q']

标签: pythonlistsorting

解决方案


您可以使用sorted以下内容key

sorted(l, key = lambda s: (s!='p', s=='q', s))
['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']

解释

为了更好地了解这是如何工作的,以下列表推导旨在复制在进行比较之前从参数中lambda定义的函数返回的内容:key

t = [(s!='p', s=='q', s) for s in pl]

print(t)
[(True, False, 'f'),
 (True, False, 'g'),
 (False, False, 'p'),
 (True, False, 'a'),
 (False, False, 'p'),
 (True, False, 'c'),
 (True, False, 'b'),
 (True, True, 'q'),
 (True, False, 'z'),
 (True, False, 'n'),
 (True, False, 'd'),
 (True, False, 't'),
 (True, True, 'q')]

这将key用于对列表中的项目进行排序,如文档中所述:

key 参数的值应该是一个函数,它接受一个参数并返回一个用于排序目的的键。

因此,考虑到False = 0True = 1,当这个元组列表被排序时,结果将如下:

sorted(t)
[(False, False, 'p'),
 (False, False, 'p'),
 (True, False, 'a'),
 (True, False, 'b'),
 (True, False, 'c'),
 (True, False, 'd'),
 (True, False, 'f'),
 (True, False, 'g'),
 (True, False, 'n'),
 (True, False, 't'),
 (True, False, 'z'),
 (True, True, 'q'),
 (True, True, 'q')]

推荐阅读