从一个字典列表中提取值到另一个字典中

时间:2019-07-05 14:12:59

标签: python list dictionary

如何将特定项目从一个列表复制到另一个列表?我的原著是:

[
    {
        "values" : {
            "val1"    : 334,
            "val2"   : 994,
            "val3"  : 33,
            "val4" : 345,
        },
        "filename": "image1.jpg",
    },
    {
        "values" : {
            "val1"    : 567,
            "val2"   : 777,
            "val3"  : 787,
            "val4" : 678,
        },
        "filename": "image2.jpg",
    },
]

我希望我的新数组看起来像这样:

[
    {
        "index" : 0,
        "filename": "image1.jpg",
        "val1: 334,
        "val3: 33,
    },
    {
        "index" : 1,
        "filename": "image2.jpg",
        "val1: 567,
        "val3: 787,
    },
]

我已经尝试过了,但是没有用:

for (i, x) in original:
        new.extend([{
            "index" : i,
            "filename" : x.filename,
            "val1" : x.val1,
            "val2" : x.val2,
        }])

我要去哪里错了?

5 个答案:

答案 0 :(得分:2)

类似这样的东西:

#!/usr/bin/python3
original=[
    {
        "values" : {
            "val1"    : 334,
            "val2"   : 994,
            "val3"  : 33,
            "val4" : 345,
        },
        "filename": "image1.jpg",
    },
    {
        "values" : {
            "val1"    : 567,
            "val2"   : 777,
            "val3"  : 787,
            "val4" : 678,
        },
        "filename": "image2.jpg",
    },
]
new=[]
for (i, x) in enumerate(original):
        new.append({
            "index" : i,
            "filename" : x["filename"],
            "val1" : x["values"]["val1"],
            "val2" : x["values"]["val2"],
        })
print(new)

答案 1 :(得分:1)

尝试这个:

def f(x):
    y = []
    for i, j in enumerate(x):
        z = {}
        z["index"] = i
        z["filename"] = j["filename"]
        for k, m in enumerate(j["values"]):
            z[f"val{k + 1}"] = j["values"][m]
        y.append(z)
    return y


x = [
    {
        "values" : {
            "val1"    : 334,
            "val2"   : 994,
            "val3"  : 33,
            "val4" : 345,
        },
        "filename": "image1.jpg",
    },
    {
        "values" : {
            "val1"    : 567,
            "val2"   : 777,
            "val3"  : 787,
            "val4" : 678,
        },
        "filename": "image2.jpg",
    },
]

print(f(x))

答案 2 :(得分:1)

首先,假设您的original是顶部列表,则需要枚举它,而不是像字典一样进行迭代。接下来,如果您查看输入内容,则值实际上位于第二层。

您的代码应如下所示:

transformed_dicts = []
for i, orig_dict in enumerate(original):
    transformed = {
        'index': i,
        'filename': orig_dict['filename'],
        'val1': orig_dict['values']['val1'],
        'val3': orig_dict['values']['val3'],
    }
    transformed_dicts.append(transformed)

您可以“重构”此列表以使用列表理解功能,但我认为这种方式更具可读性。

答案 3 :(得分:1)

我几乎给出了与Mayhem相同的答案,但请注意,即使示例代码获得了val3,问题中仍要求使用val2。我敢肯定这不是一个破坏交易的人。我使用(可能是滥用了)列表理解而不是循环。

result = [{'index': i, 
  'filename': val['filename'],
  'val1': val['values']['val1'],
  'val3': val['values']['val3']
  } for i, val in enumerate(original)]

print(result)

输出为:

  

[{'index':0,'filename':'image1.jpg','val1':334,'val3':33},   {'index':1,'filename':'image2.jpg','val1':567,'val3':787}]

答案 4 :(得分:0)

我会说您在使用2个变量遍历列表时出了错。

我建议的解决方案如下:

records = []
index = 0
for i in original:
    record = {'index': index,
              'filename': i['filename'],
              'val1': i['values']['val1'],
              'val3': i['values']['val3']}
    index += 1
    records.append(record)