首页 > 解决方案 > 是否有任何函数将元组列表转换为字典,其中键作为元组中的第二个元素

问题描述

作为标题,我有一个这样的元组列表:

words = [('word1', '+'), ('word2', '+'), ('word3', '-'), ...]

我想将它转换为 a dict,每个元组中的第二个元素作为键,它的值是一个单词列表。我知道我可以遍历它并添加到 adefaultdict中,但是有没有更快的方法或内置函数,只需要一行代码?

异常输出:

my_dict = {'+': ['word1', 'word2', ...], '-': ['word3', ...]}

我试过这个:

my_dict = defaultdict(list)
for word, key in words:
    my_dict[key].append(word)

标签: pythonlistdictionarytuples

解决方案


您可以将more_itertools.map_reduceoperator.itemgetter

more_itertools.map_reduce(iterable, keyfunc, valuefunc=None, reducefunc=None)

返回一个字典,将 iterable 中的项目映射到 keyfunc 定义的类别,用 valuefunc 转换它们,然后用 reducefunc 按类别汇总它们。

from more_itertools import map_reduce
from operator import itemgetter


words = [('word1', '+'), ('word2', '+'), ('word3', '-'), ('word2', '+')]

map_reduce(words, itemgetter(1), itemgetter(0))
# defaultdict(None, {'+': ['word1', 'word2', 'word2'], '-': ['word3']})

此外,您可以使用itertools.groupby

from itertools import groupby

my_dict = {k : [t[0] for t in g] for k, g in groupby(words, key=lambda t: t[1])}

如果您的元组未根据您的元组中的第二项排序,则您必须对您的words

from itertools import groupby

my_dict = {k : [t[0] for t in g] for k, g in groupby(sorted(words, key=lambda t: t[1]), key=lambda t: t[1])}
my_dict

这个解决方案并不快,但你可以写一行


推荐阅读