Saya memiliki kunci wajib di bawah ini

fields = ['b1', 'b2', 'b3']

Kamus saya ada di bawah

body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}

  • Di kunci b badan saya perlu memeriksa bidang semua nilai ada atau tidak

  • jika fields = ['b1', 'b2', 'b4'] yang saya butuhkan False karena b4 tidak ada di body['b']

  • jika body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b4': 6}]} maka saya juga membutuhkan False karena b4 tidak ada di fields

Kode saya di bawah

all((field in list(each.keys()) for each in body['b']) for field in fields)

Setiap kali saya mendapatkan True

1
sim 12 Mei 2021, 13:07

6 jawaban

Jawaban Terbaik

Anda mendapatkan selalu Benar karena kode Anda melakukan all pada urutan generator.

Seperti yang dikatakan orang lain, melakukan ini dengan pemahaman TIDAK dapat dibaca, jadi tidak disarankan.

Jika Anda membutuhkannya, Anda dapat menggunakan ini:

body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}

fields = ['b1', 'b2', 'b4']
out = all(all((f in each.keys() for f in fields)) for each in body['b'])
print(out)  #=> False

fields = ['b1', 'b2', 'b3']
out = all(all((f in each.keys() for f in fields)) for each in body['b'])
print(out)  #=> True
1
Lior Cohen 12 Mei 2021, 10:43

Ini berfungsi, jika Anda benar-benar membutuhkan pemahaman daftar:

fields = ['b1', 'b2', 'b3']
body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b4': 6}]}
print(False not in [i in fields for i in [item for subl in [list(d.keys()) for d in body['b']] for item in subl]])

Keluaran:

False

Tetapi pada titik ini, Anda mungkin juga menggunakan loop for reguler.

0
Sid 12 Mei 2021, 10:35

Anda dapat mencobanya (kurangi dari functools):

  1. Temukan semua kunci persimpangan di dikte Anda
  2. Periksa bidang Anda di tombol persimpangan
intersection_keys = reduce(lambda x, y: x & y, map(lambda d: set(d.keys()), body["b"]))
print([field in intersection_keys for field in fields])
1
Roman Gerasimov 12 Mei 2021, 10:46

Mengingat struktur data Anda

body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}

Anda dapat menemukan semua kunci yang ada dalam dicts dalam daftar body['b'] dengan:

# find all the keys that are present
present_fields = set(sum((list(bdict.keys()) for bdict in body['b']), []))

Kemudian Anda dapat menggunakan pengurangan set untuk menemukan semua bidang yang hilang:

fields = ['b1', 'b2', 'b3']
required_fields = set(fields)
missing = required_fields - present_fields
print("MISSING2:", missing)

Mencetak set() yaitu set kosong (tidak ada bidang wajib yang hilang).

Untuk contoh lainnya:

fields = ['b1', 'b2', 'b4']
required_fields = set(fields)
missing = required_fields - present_fields
print("MISSING2:", missing)

Itu mencetak {'b4'} yang berarti bahwa bidang "b4" tidak ada.

1
thebjorn 12 Mei 2021, 10:45

Gunakan set()

a = set(body['b'][0]) | set(body['b'][1])
b = set(fields)
c = a ^ b
print(c)
if len(c):
    print(False)
else:
    print(True)
1
ianfun 12 Mei 2021, 10:33

Bagaimana dengan membuat fungsi lambda seperti di bawah ini:

>>> fields = ['b1', 'b2', 'b3']
>>> body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}
>>> trueFalse = lambda x, y: [TorF in y for TorF in x].count(True) == len(x)
>>> all((trueFalse(list(x.keys()),fields)) for x in body["b"] )
True
>>>
>>> body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b4': 6}]}
>>> all((trueFalse(list(x.keys()),fields)) for x in body["b"] )
False
1
m.i.cosacak 12 Mei 2021, 10:25