Berikut ini adalah bagian dari kamus bersarang yang saya miliki:

data = {
    '1': {'Address': '10/3 Beevers St',
       'Age': '27',
       'Job': 'Doctor',
       'Married': 'No',
       'Name': 'John',
       'Sex': 'Male',
       'Suburb': 'Marine'},
 '2': {'Address': '11/2 Sayers St',
       'Age': '22',
       'Job': 'Lawyer',
       'Married': 'Yes',
       'Name': 'Marie',
       'Sex': 'Female',
       'Suburb': 'Raffles'},
 '3': {'Address': '5/1 Swamphen St',
       'Age': '24',
       'Job': 'Manager',
       'Married': 'No',
       'Name': 'Luna',
       'Sex': 'Female',
       'Suburb': 'Eunos'},
 '4': {'Address': '25/12 Swamphen St',
       'Age': '35',
       'Job': 'Teacher',
       'Married': 'Yes',
       'Name': 'Larry',
       'Sex': 'Male',
       'Suburb': 'Eunos'}
}

Dan ini adalah string JSON:

json_str = '[{"Suburb": "Marine", "Address": "3 Beevers St"},\
             {"Suburb": "Raffles", "Address": "11/2 Sayers St"},\
             {"Suburb": "Eunos", "Address": "Swamphen St"}]'

Tugas saya adalah memeriksa apakah sebuah rumah ("Suburb" dan "Address") di json_str juga ada dalam kumpulan data asli (kamus bersarang disebut data). Jika ya, tambahkan kunci/nilai untuk 'Age' dan 'Name' ke string JSON untuk rumah itu.

Outputnya terlihat seperti ini:

[{'Age': 27,
  'Address': '10/3 Beevers St',
  'Name': 'John',
  'Suburb': 'Marine'},
 {'Age': 22,
  'Address': '11/2 Sayers St',
  'Name': 'Marie',
  'Suburb': 'Raffles'}]
    

Jadi, saya bertanya-tanya apakah saya bisa mendapatkan bantuan tentang cara mendekati pertanyaan ini? Saya telah mencoba menulis kode, tetapi saya terus mendapatkan kesalahan, jadi saya yakin pendekatan saya sangat salah...

def add_additional_info(data, json_str):

    python_dict = json.loads(json_str)
    new_dict = {}
    for some_id, sales_data in data.items():
        for houses in python_dict:
            if houses["Suburb"] == sales_data["Suburb"] and \
               houses["Address"] == sales_data["Address"]:
                new_dict[houses] = {'Age': sales_data['Age'],
                                    'Address': sales_data['Address'],
                                    'Name': sales_data['Name'],
                                    'Suburb': sales_data['Suburb']}
            else:
                new_dict.remove(houses)
    return new_dict.dumps
0
user15760553 24 Mei 2021, 15:05

2 jawaban

Jawaban Terbaik

Saya pikir ini melakukan apa yang Anda katakan Anda inginkan, sertakan klarifikasi yang Anda sebutkan dalam komentar tentang mengabaikan kecocokan duplikat dan urutan kunci yang ditentukan dalam hasil.

Pertama, data uji:

data = {
    '1': {'Address': '10/3 Beevers St',
       'Age': '27',
       'Job': 'Doctor',
       'Married': 'No',
       'Name': 'John',
       'Sex': 'Male',
       'Suburb': 'Marine'},
 '2': {'Address': '11/2 Sayers St',
       'Age': '22',
       'Job': 'Lawyer',
       'Married': 'Yes',
       'Name': 'Marie',
       'Sex': 'Female',
       'Suburb': 'Raffles'},
 '3': {'Address': '5/1 Swamphen St',
       'Age': '24',
       'Job': 'Manager',
       'Married': 'No',
       'Name': 'Luna',
       'Sex': 'Female',
       'Suburb': 'Eunos'},
 '4': {'Address': '25/12 Swamphen St',
       'Age': '35',
       'Job': 'Teacher',
       'Married': 'Yes',
       'Name': 'Larry',
       'Sex': 'Male',
       'Suburb': 'Eunos'}
}

json_str = '''[{"Suburb": "Marine", "Address": "3 Beevers St"},
               {"Suburb": "Raffles", "Address": "11/2 Sayers St"},
               {"Suburb": "Eunos", "Address": "Swamphen St"}]'''

Kode:

SUBSET = 'Age', 'Address', 'Name', 'Suburb'  # Keys from data to put in result.


def add_additional_info(data, json_str):

    houses = json.loads(json_str)
    updated_houses = []

    for house in houses:
        # Search original dataset for house and add it to results, but only if
        # there's a single match.

        found = None
        for some_id, sales_data in data.items():
            if(house["Suburb"] == sales_data["Suburb"] and
               house["Address"] in sales_data["Address"]):  # Might ignore unit number.

                if not found:  # First match?
                    found = {key: sales_data[key] for key in SUBSET}
                else:
                    found = None  # Ignore multiple matches.
                    break  # Halt search for house.
        if found:
            updated_houses.append(found)

    return json.dumps(updated_houses, indent=4)


result = add_additional_info(data, json_str)
print(result)

Hasil yang dicetak:

[
    {
        "Age": "27",
        "Address": "10/3 Beevers St",
        "Name": "John",
        "Suburb": "Marine"
    },
    {
        "Age": "22",
        "Address": "11/2 Sayers St",
        "Name": "Marie",
        "Suburb": "Raffles"
    }
]

0
martineau 25 Mei 2021, 12:02

Cara Anda melakukannya sekarang adalah membandingkan entri dict lengkap untuk data JSON dengan entri dict lengkap dari data lainnya. Ini tidak akan pernah cocok karena ini memiliki kunci yang terpisah, sehingga dicts secara definisi berbeda.

Anda perlu membandingkan kunci yang tepat untuk kedua entri dict, fe:

if houses['Address'] == sales_data['Address'] and houses['Suburb'] == sales_data['Suburb']:

Juga, jangan pernah menghapus entri dari dict yang Anda ulangi. Ini mengarah pada hasil yang aneh. Buat dict baru yang Anda tambahkan yang perlu Anda kembalikan, dan tambahkan entri yang cocok ke dalamnya.

0
Edo Akse 24 Mei 2021, 12:16