这是一个可能的抽象,也使用defaultdict。
代码
import collections as ct
def append_lists(key, *iterables, defaultdict_=None):
"""Return a dict of lists."""
if defaultdict_ is None:
dd = ct.defaultdict(list)
else:
dd = defaultdict_.copy()
for lst in iterables:
dd[key].extend(lst)
return dd
演示
给定一个键和一个可迭代的列表,构建一个列表字典:
lists = ["stray", "brown", "big"], ["house", "white", "small"]
d = append_lists("cat", lists)
d
# defaultdict(list,
# {'cat': [['stray', 'brown', 'big'], ['house', 'white', 'small']]})
继续向原始字典添加条目:
append_lists("dog", [["big", "wide", "yellow"]], defaultdict_=d)
# defaultdict(list,
# {'cat': [['stray', 'brown', 'big'], ['house', 'white', 'small']],
# 'dog': [['big', 'wide', 'yellow']]})
注意,原来的字典被保留了:
d
# defaultdict(list,
# {'cat': [['stray', 'brown', 'big'], ['house', 'white', 'small']]})
最后,我们可以从简单的键和项列表构建:
animals = ["mouse", "bird"]
features = (
[["small", "brown", "cute"], ["small", "white", "fast"]],
[["large", "black", "fast"]]
)
result = ct.defaultdict(list)
for k, items in zip(animals, features):
result = append_lists(k, items, defaultdict_=result)
result
# defaultdict(list,
# {'bird': [['large', 'black', 'fast']],
# 'mouse': [['small', 'brown', 'cute'],
# ['small', 'white', 'fast']]})