Python - 删除包含列表列表的dict副本

时间:2018-05-02 08:36:31

标签: python list

假设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 个答案:

答案 0 :(得分: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 :(得分:1)

如果您只需要列表中的唯一元素而不维护初始列表中元素的顺序,那么您可以在set使用itertools.chain.from_iterable。您可以将这些与列表理解一起使用,以实现所需的列表:

>>> 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

答案 2 :(得分: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))

答案 3 :(得分: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]]