假设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]]
。
答案 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]]