为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哈士奇WWW 2023-08-15 17:09:38
假设我有一本这样的字典:a = {1:"a", 3:"c", 5:"e", 4:"d" ,2:"b", 6:"f", 7:"g"}我将其转换为元组列表:b = list(a.items())现在,我想根据元组的第一个值对列表进行排序。我有三种方法可以做到这一点:from operator import itemgetterb.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) // 3batches = [[] for _ in range(batch_count)]for index, vec in enumerate(b):    batches[index % batch_count].append(vec)这组b列表至少包含 3 个。batches但是,如果我打印,我会从 获得原始订单,但预期的情况a除外。7print(batches)>>> [[(1, 'a'), (3, 'c'), (5, 'e'), (7, 'g')], [(2, 'b'), (4, 'd'), (6, 'f')]]有谁知道为什么以及如何防止这种情况?
查看完整描述

3 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

这不是同一个顺序。由于 的结果,它被偶数/奇数位置分割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]

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


查看完整回答
反对 回复 2023-08-15
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您可以使用该grouper函数将列表拆分为大小为 的列表的列表n。


from itertools import zip_longest


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


查看完整回答
反对 回复 2023-08-15
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

输出正常。您可以完全不排序地尝试一下,看看有什么不同。


batch_count = len(b) // 3

batches = [[] for _ in range(batch_count)]

for index, vec in enumerate(b):

    batches[index % batch_count].append(vec)

根据您的情况从原始列表创建两个子列表,即偶数和奇数。每一个都已排序。


查看完整回答
反对 回复 2023-08-15
  • 3 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信