【发布时间】:2018-10-12 07:29:06
【问题描述】:
假设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]]。
【问题讨论】:
假设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]]。
【问题讨论】:
您可以通过单行理解、链接和使用集合 + 排序来获得相同的结果
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]]
【讨论】:
如果您只需要列表中的唯一元素而不维护初始列表中元素的顺序,那么您可以在此处使用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
要在合并时保留子列表中元素的顺序,请查看:Pythonic way to merge two overlapping lists, preserving order
【讨论】:
我找到了一个可能的解决方案,但谁能告诉我是否有更简单的方法?
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()。
set().union(*transaction)。然后整个事情可以变成一个列表理解。
您可以将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]]
【讨论】: