gpt4 book ai didi

python - 根据元组中的索引删除重复的元组值

转载 作者:行者123 更新时间:2023-11-28 21:43:35 25 4
gpt4 key购买 nike

有没有办法根据元组中的索引删除重复的元组。说我有

[(0, 4, 1.0), (1, 4, 1.0), (3, 4, 1.0), (0, 3, 2.0), (1, 3, 2.0), (0, 2, 3.0), (1, 2, 3.0), (2, 4, 4.0), (2, 3, 5.0), (0, 1, inf)]

我能否随机保留一个元组,其中每个重复项在索引 2 处具有相同的值?

因此,有 3 个元组在索引 2 处具有值 1.0,两个元组在索引 2 处具有值 2.0,一个在索引 2 处具有值 3,依此类推。

因此,(0, 4, 1.0) 可能是从索引 2 处的值 1.0 中随机选择的,而 (1, 3, 2.0) 可能是从索引 2 处的值 2.0 中随机选择的。比如说,(1, 2, 3.0) 是从索引 2 处的值 3.0 中随机选择的。然后,我的列表看起来像

[(0, 4, 1.0),(1, 3, 2.0), (1, 2, 3.0), (2, 4, 4.0), (2, 3, 5.0), (0, 1, inf)]

我从未遇到过能做到这一点或至少能有效做到这一点的功能。

最佳答案

你可以使用 itertools.groupby根据索引 2 处的值对元组进行分组。然后对于每个组,您可以使用 random.choice选择一个元组:

>>> from itertools import groupby
>>> import random
>>> l = [(0, 4, 1.0), (1, 4, 1.0), (3, 4, 1.0), (0, 3, 2.0), (1, 3, 2.0), (0, 2, 3.0), (1, 2, 3.0), (2, 4, 4.0), (2, 3, 5.0), (0, 1, float('inf'))]
>>> [random.choice(tuple(g)) for _, g in groupby(l, key=lambda x: x[2])]
[(1, 4, 1.0), (1, 3, 2.0), (1, 2, 3.0), (2, 4, 4.0), (2, 3, 5.0), (0, 1, inf)]

在上面的 groupby 中返回可迭代的 (key, group) 元组,其中 key 是传递给 groupby 的第二个参数返回的值,group 是可迭代的一组中的元素:

>>> [(k, tuple(g)) for k, g in groupby(l, key=lambda x: x[2])]
[(1.0, ((0, 4, 1.0), (1, 4, 1.0), (3, 4, 1.0))), (2.0, ((0, 3, 2.0), (1, 3, 2.0))), (3.0, ((0, 2, 3.0), (1, 2, 3.0))), (4.0, ((2, 4, 4.0),)), (5.0, ((2, 3, 5.0),)), (inf, ((0, 1, inf),))]

因为我们不需要 key ,我们可以丢弃它并将组转换为 random.choice 期望的序列:

>>> [random.choice(tuple(g)) for _, g in groupby(l, key=lambda x: x[2])]
[(1, 4, 1.0), (1, 3, 2.0), (0, 2, 3.0), (2, 4, 4.0), (2, 3, 5.0), (0, 1, inf)]

请注意,上面期望索引 2 处具有相同值的元组在输入中彼此相邻。如果不是这种情况,您可以在将原始列表传递给 groupby 之前对其进行相应的排序。

更新 如果您只想要结果的前三个值,您可以使用生成器表达式而不是列表理解,并使用 islice 从那里提取值:

>>> from itertools import islice
>>> gen = (random.choice(tuple(g)) for _, g in groupby(l, key=lambda x: x[2]))
>>> list(islice(gen, 3))
[(0, 4, 1.0), (1, 3, 2.0), (0, 2, 3.0)]

关于python - 根据元组中的索引删除重复的元组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41973076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com