我有一个算法可以在字典的值中创建一组列表。但是,列表的数量小于字典键的数量,因为某些值是对同一列表对象的引用。
算法完成后,我想提取仅包含剩余唯一列表对象的列表。我想避免比较两个列表,因为这效率低下。
我想出了这种方法来使用 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 中执行此操作的问题。
您拥有的是一本字典,其中的值(列表)可能会重复。
集合对于减少重复数据很有用。然而,由于列表不可散列,您需要将它们转换为其他内容 - 例如,元组
你可以这样做:
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]]
此技术的一个潜在缺点是输出顺序可能不是所需的