Как я могу скопировать определенные элементы из одного списка в другой? Мой оригинал:

[
    {
        "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,
        }])

Куда я иду не так?

-1
fightstarr20 5 Июл 2019 в 17:12

5 ответов

Лучший ответ

Что-то вроде этого может быть:

#!/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)
2
Matthias 5 Июл 2019 в 15:00

Я в значительной степени придумал тот же ответ, что и в 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}]

1
Deepstop 5 Июл 2019 в 14:23

Попробуй это:

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))
1
dildeolupbiten 5 Июл 2019 в 14:21

Я бы сказал, что вы ошибаетесь, используя 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)
0
Alejandro 5 Июл 2019 в 14:23

Во-первых, предполагая, что ваш 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)

Вы можете «рефакторировать» это, чтобы использовать понимание списка, но я думаю, что этот способ более читабелен.

1
absolutelydevastated 5 Июл 2019 в 14:22