python 对字典、列表进行排序
对列表进行排序
if __name__ == "__main__":
arr = [2, 5, 7, 5, 3, 22, 551, 11]
# 对数值列表进行从小到大排序
arr.sort()
# 然后进行反转 为从大到小
arr.reverse()
# 这都是操作的原列表,不会产生新的列表,即不会额外消耗内存
print(arr)
# 使用sorted函数,会产生一个新列表
b = sorted(arr)
print(b)
[551, 22, 11, 7, 5, 5, 3, 2]
[2, 3, 5, 5, 7, 11, 22, 551]
Dictionary 是一种重要的数据结构,它通过将 key 与 value 进行映射来存储数据。Python 中的默认字典是无序数据结构。与列表一样,我们可以使用 sorted()函数按键对字典进行排序。但是,它只返回一个根据 key 排序的列表,这通常不是我们所希望的。我们可能希望它按 value 而不是按 key 进行排序,或者我们可能希望它返回一个已排序的字典而不是一个列表。在本文中,我们讨论两种简单的方法,我们可以使用这两种方法对 Python 字典进行排序,并返回所希望的结果
整理一个列表
既然我们在讨论排序,我想首先指出这两个排序函数之间的一个非常重要的区别。让我们来看看列表之间的区别。假设我们有两个列表:
if __name__ == "__main__":
num = [2, 5, 6, 1, 4, 3]
lett = ['b', 'c', 'd', 'f', 'a', 'e']
我们有两种对列表进行排序的方法,一种是使用 sort()进行 in-place 排序,另一种是使用 sorted() ,这不是 in-place 排序。不同之处在于,当使用 sort()时,您将更改原始列表,而 sorted()将返回一个新列表,而不更改原始列表。如下所示:
if __name__ == "__main__":
num = [2, 5, 6, 1, 4, 3]
lett = ['b', 'c', 'd', 'f', 'a', 'e']
num.sort()
print(num) #[1, 2, 3, 4, 5, 6]
if __name__ == "__main__":
num = [2, 5, 6, 1, 4, 3]
lett = ['b', 'c', 'd', 'f', 'a', 'e']
# num.sort()
print(sorted(num)) # [1, 2, 3, 4, 5, 6]
print(num) # [2, 5, 6, 1, 4, 3]
选用哪一种取决于实际情况。例如,如果您想保留原始记录,那么您应该使用 sorted()。如果希望节省空间和内存,那么应该使用 sort()。
整理一个字典
if __name__ == "__main__":
num = [2, 5, 6, 1, 4, 3]
lett = ['b', 'c', 'd', 'f', 'a', 'e']
dic = dict(zip(lett, num))
print(dic)
print(sorted((dic)))
print(sorted(dic.values()))
在这里使用zip
函数非常方便,我们将两个长度相同的列表中的元素映射到一起。如果长度不相等,则元素少的列表为主
为了对字典进行排序,我们必须使用sorted()
,因为字典没有内嵌的sort()
函数
如果我们直接使用sorted()
,函数将只返回字典中的key
列表,或者一个value
列表
{'b': 2, 'c': 5, 'd': 6, 'f': 1, 'a': 4, 'e': 3}
['a', 'b', 'c', 'd', 'e', 'f']
[1, 2, 3, 4, 5, 6]
我们可以调用字典中的items()
函数按key
对它进行排序,并返回一个元组列表:
print(sorted(dic.items()))
[('a', 4), ('b', 2), ('c', 5), ('d', 6), ('e', 3), ('f', 1)]
如果我们想按相反的顺序排序key
,我们可以在排序函数中指定它进行反转排序
print(sorted(dic.items(),reverse=True))
[('f', 1), ('e', 3), ('d', 6), ('c', 5), ('b', 2), ('a', 4)]
如果我们想要按 value 进行排序呢?有两种方法可以做到这一点。一种是使用 sorted() ,但是指定使用 lambda 函数进行排序的关键;另一种是不使用默认字典类型,而是使用不同的字典类型,直接按 value 对字典进行排序。
对于第一个方法,sorted 函数是使用一个 key 参数,用于指定在进行比较之前对每个元素调用的函数(或其他可调用的函数)。在这里,我们可以使用 lambda
函数来告诉 sorted()函数使用元素的哪一部分进行比较。具体来说:
print(sorted(dic.items(), key=lambda x: x[1]))
[('f', 1), ('b', 2), ('e', 3), ('a', 4), ('c', 5), ('d', 6)]
Python 是零索引,因此 x[1]指定每个元素的第二部分是一个字典,它是值。如果你想要一个反向顺序,除了在 sorted()函数中添加一个反向参数,我们还可以在 lambda 函数中使用一个负号:
print(sorted(dic.items(), key=lambda x: -x[1]))
[('d', 6), ('c', 5), ('a', 4), ('e', 3), ('b', 2), ('f', 1)]
但是,这种技巧只有在 value 值为数值变量时才有效。如果它是一个字符串变量,我们必须使用反向参数
如果您有一个值为数值的字典,那么在创建字典时还可以使用不同的字典类型来直接对字典进行排序。字典类型可以是来自集合库的 Counter:
Counter 是一个 dict 子类,它是一个无序集合,其中元素作为字典的 key 存储,它们的计数作为字典的 value 存储。
创建 Counter 时,使用以下代码
from collections import Counter
dic_cunter = Counter(dict(zip(lett, num)))
print(dic_cunter)
# Counter({'d': 6, 'c': 5, 'a': 4, 'e': 3, 'b': 2, 'f': 1})
我们不创建默认字典,而是创建一个Counter。这是有用的,因为当我们想要按 value 对字典进行排序时,我们可以使用 most_common()函数:
print(dic_cunter.most_common())
[('d', 6), ('c', 5), ('a', 4), ('e', 3), ('b', 2), ('f', 1)]
当您希望返回按 value 降序排列的元组列表时,它非常有用。
集合库还有其他有趣的数据类型,如 OrderedDict,它保留插入的每个项的顺序。欲了解更多信息,可以查看这个网址:https://docs.python.org/2/library/collections.html#。
返回一个已排序的字典
dic_sorted = sorted(dic.items())
print(dic_sorted)
dicc = {k: v for k, v in dic_sorted}
print(dicc)
[('a', 4), ('b', 2), ('c', 5), ('d', 6), ('e', 3), ('f', 1)]
{'a': 4, 'b': 2, 'c': 5, 'd': 6, 'e': 3, 'f': 1}
列表中套字典,根据字典的key或者value进行排序
from operator import itemgetter
dict_list = [{"ming": 87}, {"mei": 93}, {"hua": 68}, {"jon": 75}, {"ston": 100}, {"jack": 56}]
mid_dict = {key: value for x in dict_list for key, value in x.items()}
print(mid_dict)
mid_list = sorted(mid_dict.items(), key=itemgetter(1)) # 如果是按照key就填0 如果是value 就是1
print(mid_list)
fin_list = [{x[0]: x[1]} for x in mid_list]
print(fin_list)
# [{'jack': 56}, {'hua': 68}, {'jon': 75}, {'ming': 87}, {'mei': 93}, {'ston': 100}]