对元组列表进行排序实际上并没有对它们进行排序

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


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')]]

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


哈士奇WWW
浏览 117回答 3
3回答

Cats萌萌

这不是同一个顺序。由于 的结果,它被偶数/奇数位置分割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]最终结果是在第一个子集合中保留偶数位置,在第二个子集合中保留赔率。

犯罪嫌疑人X

您可以使用该grouper函数将列表拆分为大小为 的列表的列表n。from itertools import zip_longestdef grouper(n, iterable):    args = [iter(iterable)] * n    return ([e for e in t if e != None] for t in zip_longest(*args))b = [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f'), (7, 'g')]batches = list(grouper(3, b))print(batches)输出:[[(1, 'a'), (2, 'b'), (3, 'c')], [(4, 'd'), (5, 'e'), (6, 'f')], [(7, 'g')]]

红颜莎娜

输出正常。您可以完全不排序地尝试一下,看看有什么不同。batch_count = len(b) // 3batches = [[] for _ in range(batch_count)]for index, vec in enumerate(b):    batches[index % batch_count].append(vec)根据您的情况从原始列表创建两个子列表,即偶数和奇数。每一个都已排序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python