Python - 删除包含列表的字典中的重复项

3
假设 training_data 是一个包含列表嵌套的字典,例如 {1:[[1,2],[1,3],[1,2,5]],2:[[1],[5],[1,6]],3:[[7],[5]]}
我想合并 training_data 中的每个值,然后将其展开为一个列表,使其变成 [[1,2,3,5],[1,5,6],[7,5]]
4个回答

3
你可以使用一行列表推导式、链式操作和集合+排序来达到相同的结果。
import itertools

d = {1: [[1, 2], [1, 3], [1, 2, 5]], 2: [[1], [5], [1, 6]], 3: [[7], [5]]}

result = [sorted(set(itertools.chain.from_iterable(v))) for v in d.values()]

print(result)

输出:

[[1, 2, 3, 5], [1, 5, 6], [5, 7]]

1
如果您只需要从列表中获取唯一元素,而不需要保留初始列表中的元素顺序,则可以在此处使用 setitertools.chain.from_iterable。您可以使用 list comprehension 来实现所需的列表,如下所示:
>>> from itertools import chain
>>> my_dict = {1: [[1, 2], [1, 3], [1, 2, 5]], 2: [[1], [5], [1, 6]], 3: [[7], [5]]}

>>> [list(set(chain.from_iterable(v))) for v in my_dict.values()]
[[1, 2, 3, 5], [1, 5, 6], [5, 7]]

注意:在 Python <3.6 中,字典是无序的,因此结果列表中子列表的顺序可能会有所不同。

为了保留子列表中元素的顺序而进行合并,请参阅:Pythonic way to merge two overlapping lists, preserving order


0
我找到了一个可能的解决方案,但是有没有人能告诉我是否有更简单的方法?
training_data = list(chain.from_iterable([transaction for _, transaction in training_data.items()]))

new_training_data = []
for transaction in training_data:
    t = set()
    for i in transaction:
        t = t.union(i)
    new_training_data.append(list(t))

你可以将[transaction for _, transaction in training_data.items()]替换为training_data.values() - Keyur Potdar
你不需要将链式调用转换为列表。联合代码可以缩短为 set().union(*transaction)。然后整个过程可以转化为一个列表推导式。 - Alex Hall

0

您可以使用列表推导式与 set

training_data = {1: [[1, 2], [1, 3], [1, 2, 5]], 2: [[1], [5], [1, 6]], 3: [[7], [5]]}

resultList = [sorted(set(elem for subList in training_data[key] for elem in subList)) for key in training_data.keys()]
print(resultList)

输出:

[[1, 2, 3, 5], [1, 5, 6], [5, 7]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接