Saya telah mencoba mengekstrak data dari kamus multi level di python contoh kamus yang saya ekstrak adalah:

{"family": {
"name": "Mary",
"age": "32",
"sex": "female",
"kids": [
  {
    "name": "jim",
    "age": "10",
    "sex": "male",
    "dob_year": "2007",
    "ssn": "123-23-1234"
  },
  {
    "name": "jill",
    "age": "6",
    "sex": "female",
    "dob_year": "2011",
    "ssn": "123-23-1235"
  }]}}


ss = test0["family"]["kids"]

def search(values, lookup):
    for k in values:
        for v in values:
            if lookup in v:
                return k
    return None
print search(ss, '201')

Tujuan saya adalah untuk mencari kata kunci (tidak tepat) dalam nilai kamus bersarang dan mengembalikan kamus lengkap atau nilai kunci tertentu seperti "23-23-1235" jika ssn diminta.

Membutuhkannya untuk mengembalikan {"name": "jill","age": "6","sex": "female","dob_year": "2011","ssn": "123-23-1235"} dari nilai permintaan di tingkat yang berbeda.

Saat ini hanya menampilkan:{"name": "jim","age": "10","sex": "male", "dob_year": "2007","ssn": "123-23-1234" }

0
KAM_00 2 November 2017, 06:18
Periksa logika loop Anda, dan Anda harus menggunakan dict.iteritems() untuk membaca item dalam kamus.
 – 
M. Leung
2 November 2017, 06:23

2 jawaban

Coba cara ini:

test0 = {"family": {
"name": "Mary",
"age": "32",
"sex": "female",
"kids": [
  {
    "name": "jim",
    "age": "10",
    "sex": "male",
    "dob_year": "2007",
    "ssn": "123-23-1234"
  },
  {
    "name": "jill",
    "age": "6",
    "sex": "female",
    "dob_year": "2011",
    "ssn": "123-23-1235"
  }]}}


ss = test0["family"]["kids"]
def search(values, lookup):
    for k in values:
        if any(lookup in str(s) for s in k.values()):
            return k
    return None
print search(ss, '201')

Itu akan mencetak:

{'age': '6', 'dob_year': '2011', 'name': 'jill', 'ssn': '123-23-1235', 'sex': 'female'}
0
Tiny.D 2 November 2017, 07:56
Yang berfungsi untuk kamus tertentu tetapi jika saya mengganti kamus saya mendapatkan "argumen tipe 'int' tidak dapat diubah" itu dalam format yang sama hanya kunci dan nilai yang berbeda
 – 
KAM_00
2 November 2017, 07:31
Saya pikir ada bilangan bulat dalam nilai dict, Anda dapat mengonversi ke string dengan fungsi str().
 – 
Tiny.D
2 November 2017, 07:58

Bagaimana jika cocok dengan dua hasil?

Jika cocok dengan lebih dari satu hasil tetapi tetap hanya akan mengembalikan satu pengembalian karena fungsi mengembalikan satu per satu oleh memori sehingga solusinya adalah menyimpan hasil di suatu tempat seperti menggunakan daftar untuk menyimpan hasilnya dan kemudian mengembalikannya pada akhirnya, pertama mari kita lihat apakah itu cocok dengan dua hasil lalu apa masalahnya:

Solusi sederhana

 def search(values, lookup):
        for item in values:
            for key,value in item.items():
                if lookup in value:
                    return item
        return None
    print(search(ss, '20'))

Itu cocok dengan dua hasil tetapi hasilnya adalah:

{'dob_year': '2007', 'ssn': '123-23-1234', 'sex': 'male', 'age': '10', 'name': 'jim'}

Jadi solusinya adalah:

def search(values, lookup):
    result = []

    for item in values:
        for key,value in item.items():
            if lookup in value:
                if item not in result:
                    result.append(item)

    if result:
        return result
    else:
        return None
print(search(ss, '20'))

Keluaran:

[{'ssn': '123-23-1234', 'sex': 'male', 'dob_year': '2007', 'age': '10', 'name': 'jim'}, {'ssn': '123-23-1235', 'sex': 'female', 'dob_year': '2011', 'age': '6', 'name': 'jill'}]
0
Aaditya Ura 2 November 2017, 15:40