在列表的开头和结尾强制元素

26 python sorting list

如何修改此列表以使所有列表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)

  • 现在,这很酷.你能解释一下吗?sorted sort True <characters <False? (3认同)
  • @ScottBoston不,它返回一个(bool,bool,str)元组 (3认同)
  • 所以(False,False)最先出现,(True,True)结束.在两者之间会有(真,假) (3认同)

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)


jua*_*aga 7

只需定义一个合适的键功能:

>>> 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.