如何修改此列表以使所有列表p's出现在开头,q's结尾处,以及它们之间的值按字母顺序排序?
l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
Run Code Online (Sandbox Code Playgroud)
所以我想:
['p','p','a','b','c','d','f','g','n','t','z','q','q']
Run Code Online (Sandbox Code Playgroud)
yat*_*atu 55
您可以使用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']
Run Code Online (Sandbox Code Playgroud)
说明
为了更好地了解这是如何工作的,以下列表理解旨在复制在进行比较之前从参数中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')]
Run Code Online (Sandbox Code Playgroud)
然后,这将key用于对列表中的项进行排序,如文档中所述:
key参数的值应该是一个函数,它接受一个参数并返回一个用于排序的键.
因此,考虑到这一点,False = 0并且True = 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')]
Run Code Online (Sandbox Code Playgroud)
jpp*_*jpp 19
一种想法是使用具有自定义功能的优先级字典.如果您希望包含其他标准,这自然可以扩展.
L = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
def sort_func(x):
priority = {'p': 0, 'q': 2}
return priority.get(x, 1), x
res = sorted(L, key=sort_func)
print(res)
['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']
Run Code Online (Sandbox Code Playgroud)
Dan*_*ejo 14
使用sorted中的key参数:
l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
def key(c):
if c == 'q':
return (2, c)
elif c == 'p':
return (0, c)
return (1, c)
result = sorted(l, key=key)
print(result)
Run Code Online (Sandbox Code Playgroud)
产量
['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']
Run Code Online (Sandbox Code Playgroud)
只需定义一个合适的键功能:
>>> def _key(x):
... if x == 'p':
... return -1
... elif x == 'q':
... return float('inf')
... else:
... return ord(x)
...
>>> l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
>>> sorted(l, key=_key)
['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']
Run Code Online (Sandbox Code Playgroud)
注意,每个字符都映射到一个整数> = 0,所以我们可以依赖ord,因为它-1总是小于返回的任何东西ord,我们可以用它来表示p,而对于q,我们可以使用无穷大,所以它会总是比返回的东西更大ord.