【问题标题】:Python - add dictionaries to listPython - 将字典添加到列表中
【发布时间】:2018-10-03 15:01:13
【问题描述】:

列表 1

[]

字典 1

{ 
   'test': 'baum',
   'alter': 0,
   'voegel': ['amsel']
}

字典 2

{ 
   'test': 'grosserbaum',
   'alter': 3,
   'voegel': ['meise']
}

做一些事情将字典合并在一起......

结果:

[
   { 
      'test': 'baum',
      'alter': 0,
      'voegel': ['amsel'] 
   }, 
   { 
      'test': 'grosserbaum',
      'alter': 3,
      'voegel': ['meise']
   }
]

如何使用 Python 做到这一点?谢谢!

【问题讨论】:

  • 创建一个列表并附加两个字典?
  • 您请求的输出会引发TypeError。这不是一个有效的字典结构,而是一个不可能的set()
  • @mad_ 对,我看到数据不同了。他正在寻找一套听写,
  • 重申/添加到@roganjosh 的答案,你的问题是模棱两可的。您是在尝试创建 dict 对象或一组 dicts 的嵌套字典,还是尝试将 dict1 和 dict2 中的值与相同的键或 JSON 文件组合?最后你想拥有什么对象type()
  • 您向我们展示的结果不是字典,而是两个字典的列表。键必须是唯一的,并且您显然有重复。所以你需要考虑在这种情况下你想做什么。我建议使用每个字典中的键创建一个字典,然后为原始字典中的每个键获取值并将其插入到列表中。结果将是一个包含列表值的字典,并且每个列表都将包含两个原始字典中相同键的值。

标签: python dictionary merge


【解决方案1】:
d1={ 
   'test': 'baum',
   'alter': 0,
   'voegel': ['amsel']
}
d2={ 
   'test': 'grosserbaum',
   'alter': 3,
   'voegel': ['meise']
}

让我们试试你的预期输出

{d1:d2} #TypeError: unhashable type: 'dict'

由于无法对 dict 类型进行哈希处理,因此引发了错误。类似于列表类型,因为它不带有哈希函数。因此,故事的寓意是为了让一个对象是可散列的,它必须是不可变的类型,如stringintegertuple

如果您只是想遍历字典

[d1,d2] # convert into a list

(d1,d2)# convert into a tuple

或使用不可变键创建一个新列表

{'d1':d1,'d2':d2}

更多参考https://www.asmeurer.com/blog/posts/what-happens-when-you-mess-with-hashing-in-python/

【讨论】:

  • 一个带有字典的列表——这就是我要找的。谢谢
【解决方案2】:

如果您的dicts 中的数据永远不会改变,并且您需要密钥,那么您应该选择使用namedtuples。

您需要将嵌套的list 转换为tuple,因为列表不可散列。然后,您可以使用现有的字典并将它们放入您的 namedtuple(或直接创建它们)。

d1 = { 
   'test': 'baum',
   'alter': 0,
   'voegel': ('amsel')
}
d2 = { 
   'test': 'grosserbaum',
   'alter': 3,
   'voegel': ('meise')
}

from collections import namedtuple

Test = namedtuple("Test", "test alter voegel")

t1 = Test(**d1)
t2 = Test(**d2)

print(t1)            # Test(test='baum', alter=0, voegel='amsel')
print(t2)            # Test(test='grosserbaum', alter=3, voegel='meise')
print(set([t1, t2])) # {Test(test='grosserbaum', alter=3, voegel='meise'), Test(test='baum', alter=0, voegel='amsel')}

现在您可以将这些命名元组保存在 set 中,这样该集合将只包含唯一项!此外,namedtuples 使用的内存比 dict 少,因为它实现了__slots__

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2016-06-14
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多