【问题标题】:Changing dictionary format更改字典格式
【发布时间】:2020-06-19 14:58:00
【问题描述】:

我想在下面换一本字典……

dict = {
    'A': [('B', 1), ('C', 3), ('D', 7)],
    'B': [('D', 5)],
    'C': [('D', 12)] }

变成这样的其他形式:

dict = [
('A', 'B', 1), ('A', 'C', 3), ('A', 'D', 7),
('B', 'D', 5), ('C', 'D', 12)]

这就是我所做的。

dict = {
 'A': [('B', 1), ('C', 3), ('D', 7)],
 'B': [('D', 5)],
 'C': [('D', 12)] }

if(i[0] in dict):
    value = dict[i[0]]
    newvalue = i[1],i[2]
    value.append(newvalue)
    dict1[i[0]]=value

else:
    newvalue = i[1],i[2]
    l=[]
    l.append(newvalue)
    dict[i[0]]=l   

打印(字典)

谢谢

【问题讨论】:

  • 您对此有任何疑问或问题吗?
  • 您能确认('B', 'C', 12) 在预期的输出中吗?我认为您想要的可能是('B', 'D', 5)。另外,请发布您迄今为止尝试过的内容,以便人们可以从那里提供帮助。
  • 请确认预期输出是否正确,如果您编写了一些代码进行转换,请分享

标签: python dictionary format


【解决方案1】:

Python 元组是一个不可变对象。因此,任何试图修改它的操作(如追加)都是不允许的。但是,可以使用以下解决方法。

dict = {
    'A': [('B', 1), ('C', 3), ('D', 7)],
    'B': [('D', 5)],
    'C': [('D', 12)] }

new_dict = []

for key, tuple_list in dict.items():
    for tuple_item in tuple_list:
        entry = list(tuple_item)
        entry.append(key)
        new_dict.append(tuple(entry))

print(new_dict)

输出: [('B', 1, 'A'), ('C', 3, 'A'), ('D', 7, 'A'), ('D', 5, 'B'), ('D', 12, 'C')]

【讨论】:

    【解决方案2】:

    一个简单的方法可以是

    new_dict = []
    for letter1, list in dict.items():
        for letter2, value in list:
            new_dict.append([letter1, letter2, value])
    

    【讨论】:

      【解决方案3】:

      具有列表理解;

      dict_ = {
          'A': [('B', 1), ('C', 3), ('D', 7)],
          'B': [('D', 5)],
          'C': [('D', 12)] }
      
      result = [(key, value[0], value[1]) for key, list_ in dict_.items() for value in list_]
      

      输出;

      [('A', 'B', 1), ('A', 'C', 3), ('A', 'D', 7), ('B', 'D', 5), ('C', 'D', 12)]
      

      【讨论】:

        【解决方案4】:

        您可以使用.items() 遍历字典。请注意,每个值本身就是一个元组列表。我们想要解包每个元组,所以我们需要一个嵌套的 for 循环,如下所示。 res 是我们将在循环中填充的输出列表。

        res = []
        for key, values in dict.items():
            for value in values:
                res.append((key, value[0], value[1]))
        

        样本输出:

        >>> res
        [('A', 'B', 1), ('A', 'C', 3), ('A', 'D', 7), ('B', 'D', 5), ('C', 'D', 12)]
        

        编辑:如果value是一个多于两个元素的元组,我们将修改最后一行,使用tuple unpacking

        res.append((key, *value))
        

        这有效地解开了value 的所有元素。例如,

        >>> test = (1, 2, 3)
        >>> (0, *test)
        (0, 1, 2, 3)
        

        【讨论】:

        • 如果元组有两个以上的元素怎么办?
        • 那么我们将无法使用res.append((key, value[0], value[1]))。相反,我会使用不同的元组解包模式,例如res.append((key, *value))。但是,鉴于 OP 的示例输入和输出,我认为上面的实现就足够了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-02
        • 2013-10-22
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        相关资源
        最近更新 更多