【问题标题】:how can I convert python tuple to dict如何将 python 元组转换为 dict
【发布时间】:2014-09-26 08:33:09
【问题描述】:

如何转换以下元组列表:

t = [("x", "1","11"),("x", "2","22"),("x", "3","33"),
     ("y", "3","00"),("z", "2","222"), ("z", "3","333")]

到这个带有字典的列表列表?

[["x",{"1":"11","2":"22","3":"33"}],
 ["y",{"3":"00"}],
 ["z",{"2":"222","3":"333"}]]

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只有在发布者已经尝试自己解决问题时才会提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、堆栈跟踪、编译器错误 - 不管是什么适用的)。您提供的详细信息越多,您可能收到的答案就越多。
  • 我认为在输出中使用 tuples 列表也可以;这样就可以使用dict.items() 返回,而不必将它们映射回列表。在任何情况下,元组和列表之间的转换都很简单。

标签: python dictionary


【解决方案1】:

我是列表理解的忠实粉丝。这是一个使用它的简单解决方案:

keys = set(map(lambda x: x[0], t))
d = [[k, dict([(y, z) for x, y, z in t if x is k])] for k in keys]

结果:

[['y', {'3': '00'}],
 ['x', {'1': '11', '2': '22', '3': '33'}],
 ['z', {'2': '222', '3': '333'}]]

对于较大的列表,这会很慢,因为 d 的计算时间为 O(N^2)。

【讨论】:

    【解决方案2】:

    分两步:创建字典并跟踪您看到第一个元素的顺序,然后从中构建一个列表:

    order = []
    mapping = {}
    for outer, inner, value in t:
        if outer not in order:
            order.append(outer)
        mapping.setdefault(outer, {})[inner] = value
    
    result = [(k, mapping[k]) for k in order]
    

    或使用collections.OrderedDict() object 跟踪您第一次看到外键的顺序:

    from collections import OrderedDict
    
    mapping = OrderedDict()
    for outer, inner, value in t:
        mapping.setdefault(outer, {})[inner] = value
    
    result = mapping.items()
    

    如果顺序不重要,请使用第一个版本并删除所有对order 的引用(3 行),并在最后使用mapping.items()。

    如果你的输入总是按每个元组的第一个元素排序,你可以使用itertools.groupby():

    from itertools import groupby
    from operator import itemgetter
    
    result = [(k, {k: v for _, k, v in g}) for k, g in groupby(t, itemgetter(0))]
    

    演示:

    >>> t = [("x", "1","11"),("x", "2","22"),("x", "3","33"),
    ...      ("y", "3","00"),("z", "2","222"), ("z", "3","333")]
    >>> order = []
    >>> mapping = {}
    >>> for outer, inner, value in t:
    ...     if outer not in order:
    ...         order.append(outer)
    ...     mapping.setdefault(outer, {})[inner] = value
    ... 
    >>> [(k, mapping[k]) for k in order]
    [('x', {'1': '11', '3': '33', '2': '22'}), ('y', {'3': '00'}), ('z', {'3': '333', '2': '222'})]
    >>> mapping.items()  # ignoring order
    [('y', {'3': '00'}), ('x', {'1': '11', '3': '33', '2': '22'}), ('z', {'3': '333', '2': '222'})]
    >>> from collections import OrderedDict
    >>> mapping = OrderedDict()
    >>> for outer, inner, value in t:
    ...     mapping.setdefault(outer, {})[inner] = value
    ... 
    >>> mapping.items()
    [('x', {'1': '11', '3': '33', '2': '22'}), ('y', {'3': '00'}), ('z', {'3': '333', '2': '222'})]
    >>> from itertools import groupby
    >>> from operator import itemgetter
    >>> [(k, {k: v for _, k, v in g}) for k, g in groupby(t, itemgetter(0))]
    [('x', {'1': '11', '3': '33', '2': '22'}), ('y', {'3': '00'}), ('z', {'3': '333', '2': '222'})]
    

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 2023-03-14
      • 2019-10-16
      • 2021-05-19
      • 2017-06-27
      相关资源
      最近更新 更多