在列表中查找唯一对象的子集,其中包含对对象的重复引用

问题描述 投票:0回答:1

我有一个算法可以在字典的值中创建一组列表。但是,列表的数量小于字典键的数量,因为某些值是对同一列表对象的引用。

算法完成后,我想提取仅包含剩余唯一列表对象的列表。我想避免比较两个列表,因为这效率低下。

我想出了这种方法来使用 id 函数来做到这一点。也许这很好,但我不确定这是否是 id 的适当使用,并且想知道是否有更简单的方法来做到这一点。

# Start with a full set of unique lists
groups = {i: [i] for i in range(1, 6)}

# Algorithm joins some of the lists together which 
# reduces the total number
for a, b in [(1, 2), (2, 4)]:
    groups[a] += groups[b]
    groups[b] = groups[a]

print(groups)

输出:

{1: [1, 2, 4], 2: [1, 2, 4], 3: [3], 4: [1, 2, 4], 5: [5]}

注意:现在字典的一些值包含相同的列表,

[1, 2, 4]

# Find the remaining unique lists
all_values = list(groups.values())
ids = [id(x) for x in all_values]
result = [all_values[ids.index(a)] for a in set(ids)]

print(result)

输出:

[[1, 2, 4], [3], [5]]

这是其他语言中的一个常见问题,但我找不到关于如何在 Python 中执行此操作的问题。

python list object unique
1个回答
0
投票

您拥有的是一本字典,其中的值(列表)可能会重复。

集合对于减少重复数据很有用。然而,由于列表不可散列,您需要将它们转换为其他内容 - 例如,元组

你可以这样做:

groups = {i: [i] for i in range(1, 6)}

# Algorithm joins some of the lists together which 
# reduces the total number
for a, b in [(1, 2), (2, 4)]:
    groups[a] += groups[b]
    groups[b] = groups[a]

print(groups)

s = set()
s.update(tuple(e) for e in groups.values())

print([list(e) for e in s])

输出:

[[3], [1, 2, 4], [5]]

此技术的一个潜在缺点是输出顺序可能不是所需的

© www.soinside.com 2019 - 2024. All rights reserved.