【问题标题】:How do I fill dict's values in one list with dict's values from another list?如何用另一个列表中的 dict 值填充一个列表中的 dict 值?
【发布时间】:2015-02-07 23:44:23
【问题描述】:

我有 2 个列表,每个列表中都有 dicts,我需要根据“id”键使用第一个列表中的值填充第二个列表中的值。现在我正在使用下面的代码,但感觉太复杂了(迭代次数太多)。有没有更pythonic的方式?

a = [{'id':1, 'tag':'11'},{'id':2, 'tag':'12'},{'id':3, 'tag':'13'},{'id':4, 'tag':'14'}]
b = [{'id':1, 'tag':None},{'id':2, 'tag':None},{'id':3, 'tag':None},{'id':4, 'tag':None}, {'id':5, 'tag':None}]

for item1 in a:
    for item2 in b:
        if item1['id'] == item2['id']:
            item2['tag'] = item1['tag']

【问题讨论】:

  • 如果密钥相同,为什么不直接使用b = a
  • 当你有一个字典列表时,这有时表明数据结构的选择是错误的。为什么需要字典列表?为什么你不能让你的列表成为一个单一的字典,并让“id”成为键并“标记”价值。
  • @Falmarri 更进一步,如果“id”字段始终是连续的,只需使用“标签”值列表。

标签: python list for-loop dictionary


【解决方案1】:

你不能做类似的事情

a = [{'id':1, 'tag':'11'},{'id':2, 'tag':'12'},{'id':3, 'tag':'13'},{'id':4, 'tag':'14'}]
b = [{'id':1, 'tag':None},{'id':2, 'tag':None},{'id':3, 'tag':None},{'id':4, 'tag':None}, {'id':5, 'tag':None}]


b[0:len(a)] = a

【讨论】:

  • 样式提示:你可以省略b[0:len(a)]中的0,因为Python默认将起始位置设置为0
  • 这是按位置匹配,而不是按 id。 ids真的是多余的吗?此外,您将 b 中的 dicts 替换为对 a 中的 dicts 的引用;如果你稍后修改a的dicts,b也会改变!
  • True 没错,但我只是建议一种快速的 Python 方式。它可能会遇到问题。但它适用于这个例子。我不确定他要求的例子有多具体。
【解决方案2】:

您的代码似乎不正确;您有两个字典列表,并且仅当两个字典在 id 中的列表位置匹配时,才复制 tag 的值。如果列表完全匹配,则不需要检查 id,如果需要检查 id,则不必关心字典出现在哪里。所以让我们假设 ID 很重要;按 ID 匹配的标准方法是将它们全部索引到另一个字典中。所以我会这样做:

index = [ (item1["id"], item1) for item1 in a ]
for item2 in b:
    if item2['id'] in index:
        item2['tag'] = index[ item2['id'] ]['tag']

这很清楚,但是您可以通过立即获取并保存值来避免重复查找, 如果可能的话:

index = [ (item1["id"], item1) for item1 in a ]
for item2 in b:
    try:
        id2 = item2["id"]
        newval = index[id2]["tag"]
        item2["tag"] = newval
    except ValueError:
        pass

【讨论】:

    【解决方案3】:

    我建议构建一个新字典,将 ID 值与标签值配对。然后您可以通过a 并更新您想要更新的值。这是我能写的最清晰的代码:

    bvals = {d['id']:d['tag'] for d in b}
    
    for d in a:
        id_val = d['id']
        if id_val in bvals:
            d['tag'] = bvals[id_val]
    

    它更简洁一些,但你可以用更少的代码做到这一点:

    for d in a:
        d['tag'] = bvals.get(d['id'], d['tag'])
    

    这依赖于字典上的.get() 方法,如果有一个键,则返回由键索引的值,如果字典中不存在该键,则返回默认值。此代码使用已存储在键 tag 下的字典中的值作为默认值。

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2014-09-21
      • 1970-01-01
      • 2018-05-08
      相关资源
      最近更新 更多