【问题标题】:How do I convert a list of tuples to a dictionary如何将元组列表转换为字典
【发布时间】:2019-04-17 14:52:43
【问题描述】:

我有一个元组列表,如下所示:

lst_of_tpls = [(1, 'test2', 3, 4),(11, 'test12', 13, 14),(21, 'test22', 23,24)]

我想把它转换成字典,让它看起来像这样:

mykeys = ['ones', 'text', 'threes', 'fours']
mydict = {'ones': [1,11,21], 'text':['test2','test12','test22'], 
          'threes': [3,13,23], 'fours':[4,14,24]}

我曾尝试像这样枚举lst_of_tpls

mydict = dict.fromkeys(mykeys, [])
for count, (ones, text, threes, fours) in enumerate(lst_of_tpls):
    mydict['ones'].append(ones)

但这会将我希望在“ones”中看到的值也放在其他“类别”中:

{'ones': [1, 11, 21], 'text': [1, 11, 21], 'threes': [1, 11, 21], 'fours': [1, 11, 21]}

另外,我想让mykeys 保持灵活。

【问题讨论】:

  • @BearBrown 你不必同意吗?不知道你为什么要告诉我这个?

标签: python


【解决方案1】:

您可以申请zip 两次以找到合适的配对:

lst_of_tpls = [(1, 'test2', 3, 4),(11, 'test12', 13, 14),(21, 'test22', 23,24)]
mykeys = ['ones', 'text', 'threes', 'fours']
new_d = {a:list(b) for a, b in zip(mykeys, zip(*lst_of_tpls))}

输出:

{
 'ones': [1, 11, 21],
 'text': ['test2', 'test12', 'test22'],
 'threes': [3, 13, 23],
 'fours': [4, 14, 24]
}

【讨论】:

  • 好的,很酷,这很有效。对我来说有很多新语法;让我们看看我是否理解:zip(*lst_of_tpls) 返回一个迭代器,其中包含元组的第一个、第二个、... 元素。外部拉链为其添加了钥匙。所以现在我有一个用于键、元组对的迭代器。然后使用这个迭代器生成字典,并在运行中将第一个 zip 给我的元组转换为一个列表。
  • @evilovive 没错。 zip(*lst_of_tpls)lst_of_tpls 中的元素配对,第二个zipmykeys 中的每个元素与zip(*lst_of_tpls) 中的每个元素配对。
【解决方案2】:

你可以传递给 (key, value) 的 dict 元组,它比使用字典理解快两倍

lst_of_tpls = [(1, "test2", 3, 4), (11, "test12", 13, 14), (21, "test22", 23, 24)]
mykeys = ["ones", "text", "threes", "fours"]
my_dict = dict(zip(mykeys, zip(*lst_of_tpls)))

输出:

{'ones': (1, 11, 21),
 'text': ('test2', 'test12', 'test22'),
 'threes': (3, 13, 23),
 'fours': (4, 14, 24)}

Profiler 示例:

lst_of_tpls = [(1, "test2", 3, 4), (11, "test12", 13, 14), (21, "test22", 23, 24)]
mykeys = ["ones", "text", "threes", "fours"]


def dict_comprehension():
    return {a: list(b) for a, b in zip(mykeys, zip(*lst_of_tpls))}


def dict_generator():
    return dict(zip(mykeys, zip(*lst_of_tpls)))


if __name__ == "__main__":
    import timeit

    funcs = (dict_comprehension, dict_generator)
    for f in funcs:
        result = timeit.timeit(f, number=10000, globals=globals())
        print(f"{f.__name__}: {result:.5f}")


dict_comprehension: 0.05009 
dict_generator: 0.02468

【讨论】:

  • 有趣。你能试着解释一下 dict-comprehension 和创建一个新的 dict(...) 有什么区别吗?这是一个同样适用于 [...] 与 list(...) 创建的一般规则吗?
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2010-09-20
  • 2017-06-07
相关资源
最近更新 更多