首页 > 解决方案 > 对元组列表进行排序实际上并没有对它们进行排序

问题描述

假设我有一本这样的字典:

a = {1:"a", 3:"c", 5:"e", 4:"d" ,2:"b", 6:"f", 7:"g"}

我将其转换为元组列表:

b = list(a.items())

现在,我想根据元组的第一个值对列表进行排序。我有三种方法可以做到这一点:

from operator import itemgetter
b.sort(key=itemgetter(0))

b.sort(key=lambda x: x[::-1])
b = sorted(b, key=lambda t: (t[0]))

在任何一种情况下,如果我打印,b我都会得到排序列表:

print(b)

>>> [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f'), (7, 'g')]

但是,如果我实际b在一个进程中使用,结果是它没有排序。我测试了一些东西,但目前我手头的东西是这样的:

batch_count = len(b) // 3
batches = [[] for _ in range(batch_count)]
for index, vec in enumerate(b):
    batches[index % batch_count].append(vec)

这组b到至少 3 个列表。batches但是,如果我打印,我会从 获得原始订单,但预期a除外。7

print(batches)

>>> [[(1, 'a'), (3, 'c'), (5, 'e'), (7, 'g')], [(2, 'b'), (4, 'd'), (6, 'f')]]

有谁知道为什么以及如何防止这种情况发生?

标签: pythonpython-3.xsortingtuples

解决方案


这不是同一个顺序。由于index % batch_count.

如果 abatch_count为 2,则您有index % 2,它将在0和之间交替1

>>> [i % 2 for i in range(10)]
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

最终结果是在第一个子集合中保持偶数位置,在第二个子集合中保持赔率。


推荐阅读