Actualizarea elementului de listă în python (Programare, Python, Json, Lista)

EgzEst a intrebat.
a intrebat.

În codul meu python Dacă am o listă ca aceasta:

   my_list= [{"name": "my name", "timestamp": {"$date": 1459002562091}, "longitude": 20.169550966746304, "location": "Work", "victim": {"language": "English", "locality": "Bern", "gender": "Other", "region": "Gabon", "birthday": {"$date": 506736000000}, "nationality": "United States", "ethnicity": "Bosnian"}, "person": "Stranger", "latitude": 43.05529651674635, "personGender": "Male", "type": ["Shouting"]}, {"name": "my name", "timestamp": {"$date": 1455632962091}, "longitude": 21.292620354706038, "location": "Public Space", "victim": {"language": "English", "locality": "Ferizaj", "gender": "Other", "region": "Kosovo", "birthday": {"$date": 601516800000}, "nationality": "Canada", "ethnicity": "Turkish"}, "person": "Waiter", "latitude": 42.81558228232729, "personGender": "Male", "type": ["Comments", "Whistling"]}]

Vreau să modific această listă pentru a face o verificare în interiorul elementelor JSON din această listă, apoi vreau să găsesc elementul name pentru a verifica valoarea lor și folosesc o altă funcție pentru a înlocui valoarea, așa că aici voi folosi ca exemplu „Just an example string”.

Și, de asemenea, pentru tip, dacă tipul este, fac aceeași verificare și înlocuiesc valoarea lor cu o altă funcție, dar aici voi pune aceeași valoare „Exemplu de tip”.

Așa că am început așa:

for item in my_list:
    item["name"] = "Just an example string"
    for element in item["type"]:
        element = "Type example"

Acum vreau să salvez aceste câmpuri actualizate în aceeași listă, deci trebuie doar să actualizez aceste două câmpuri, iar celelalte trebuie să rămână la fel? Cum pot face acest lucru? Vă rog să mă ajutați.

Comentarii

  • Acesta este de fapt un dicționar Python, nu JSON –  > Por OneCricketeer.
  • Aveți o listă Python, și încă una malformată. Este posibil să fi încărcat datele din JSON, dar asta nu contează pentru modul în care utilizați apoi structura. –  > Por Martijn Pieters.
  • @cricket_007 Tocmai am încercat să șterg te valorile reale și să pun valori de exemplu, pentru asta am făcut greșeli în dicționarul python. –  > Por EgzEst.
  • Se pare că ar fi trebuit să folosiți loads din bson.json_util. Acestea sunt datele returnate în MongoDB Extended JSON de la MongoDB. –  > Por Blakes Seven.
3 răspunsuri
ForceBru

Va trebui să folosești indexarea în loc de for something in iterable: notație:

for i in range(0, len(my_list)):
    my_list[i]["name"] = "Just an example string"
    for j in range(0, len(my_list[i]["type"])):
        my_list[i]["type"][j] = "Type example"

Acest lucru va actualiza lista de dicționare (nu JSON) pe loc.

Editați: așa cum a subliniat @gtlambert, nu este necesar să se pună un zero ca prim argument pentru range, , puteți scrie doar range(some_number).

Comentarii

  • Nu este necesar să folosiți 0 ca argument pentru range –  > Por gtlambert.
  • @cricket_007, am presupus că acesta este pur și simplu un mare greșeală de tipar. Poate că OP a fost scris că toate peste tot din nou în loc de copiere & lipire. –  > Por ForceBru.
  • Nu este nevoie să folosiți un interval pentru a modifica interiorul unei liste sau al unui dicționar în python. Iterarea dicționarelor și a listelor în python se face prin referință. Orice modificare a elementului la care se face referire se va reflecta în dicționarul/lista originală. –  > Por Michael Robellard.
  • @ForceBru mulțumesc mult pentru răspunsul tău! Primesc această eroare: TypeError: indicii de șiruri de caractere trebuie să fie întregi, nu str la my_list[i][„name”]] –  > Por EgzEst.
  • @EgzEst, te rog să copiezi & lipești lista în răspunsul tău (am editat-o) și să rulezi asta din nou –  > Por ForceBru.
Munam Tariq

Iată cum puteți actualiza elementele listei în python

list = ['physics', 'chemistry', 1997, 2000];
print "Value available at index 2 : "
print list[2]
list[2] = 2001;
print "New value available at index 2 : "
print list[2]

Michael Robellard

În Python, listele și dicționarele sunt mutabile și transmise prin referință, iar șirurile, numerele și tușele sunt imuabile și transmise prin valoare.

Prin urmare, dacă parcurgeți o listă de ints sau șiruri de caractere folosind for x in l: nu le veți putea modifica, deoarece x este valoarea reală a int sau a șirului.

In [17]: l = [1, 2, 3, 4, 5]

In [18]: for x in l:
   ....:     x = 0
   ....:     

In [19]: l
Out[19]: [1, 2, 3, 4, 5]

Cu toate acestea, atunci când aveți o listă de dicționare, totul se schimbă:

In [31]: l=[{'a':1}, {'a':2}]

In [32]: for x in l:
   ....:     x['a'] = 0
   ....:     

In [33]: l
Out[33]: [{'a': 0}, {'a': 0}]

Prin urmare, exemplul dvs. original funcționează așa cum ați scris, unde puteți schimba elementele dicționarului în interiorul listei, dar nu puteți schimba tipul în același mod, deoarece este vorba pur și simplu de o listă de șiruri de caractere.

In [14]: my_list = [
   ....:     {"id": 1 ,"number":12, "name": "test1", "type":["read"]}, 
   ....:     {"id": 1 ,"number":12, "name": "test2","type":["write"]},
   ....:     {"id": 1 ,"number":12, "name": "test3","type":["read", "write"]}
   ....:     ]

In [15]: for item in my_list:
   ....:         item["name"] = "Just an example string"
   ....:         for element in item["type"]:
   ....:                 element = "Type example"
   ....:         

In [16]: my_list
Out[16]: 
[{'id': 1, 'name': 'Just an example string', 'number': 12, 'type': ['read']},
 {'id': 1, 'name': 'Just an example string', 'number': 12, 'type': ['write']},
 {'id': 1,
  'name': 'Just an example string',
  'number': 12,
  'type': ['read', 'write']}]

In [17]: 

Iată o soluție mai pitorească la această problemă:

In [35]: for item in my_list:
   ....:     item["name"] = "Just an example string"
   ....:     item["type"] = ["Type Example" for element in item["type"]]
   ....:     

In [36]: my_list
Out[36]: 
[{'id': 1,
  'name': 'Just an example string',
  'number': 12,
  'type': ['Type Example']},
 {'id': 1,
  'name': 'Just an example string',
  'number': 12,
  'type': ['Type Example']},
 {'id': 1,
  'name': 'Just an example string',
  'number': 12,
  'type': ['Type Example', 'Type Example']}]

In [37]: