thiva7 Δημοσ. 27 Οκτωβρίου 2021 Δημοσ. 27 Οκτωβρίου 2021 Καλησπερα , εχω ενα json αρχειο το οποιο παιρνω με python με τον εξής τροπο def data(): url = "http://domain.com/response.json" req = urllib.request.Request(url) ##parsing response r = urllib.request.urlopen(req).read() data_json = json.loads(r) return data_json Τα προβλαματα ξεκινούν απο δω και περα , Θελω να συνδιασω την μια τιμη του αρχειου με το αλλο το δεμο json ειναι αυτο { "names": [ { "id1": "12345", // 0 - 0 "id2": "6789", // 0 - 1 "name": "Onoma 1 ", "last": "Epitheto 1 ", }, { "id1": "New123455", // 1 -2 "id2": "New6789", // 1 - 3 "name": "Onoma 2", "last": "Onoma 2" }, ], "another": [ { "name": "Onoma 1", "id": "12345" }, { "name": "Onoma 1", "id": "6789" }, { "name": "Onoma 2", "id": "New123455" }, { "name": "Onoma 2", "id": "New6789" }, ], } θελω την τιμη ID απο το "another": [ ...// "id": να το συγκρινο με το id1 η id2 απο το "names": [ και οποιο id1 η id2 ταιριαζει με το id απο το "another": [ ...// "id": να δειχνω εκεινα τα στοιχεια. οταν κανω το for i in range(len(data()['onoma'])): print(i) γυρναει 0 και 1 ( δυο στοιχεια οκ κομπλε) αλλα για το for i in range(len(data()['another'])): print(i) γυρναει 0 ,1 ,2 ,3 ( εχει 4 στοιχεια ) και σε οποιο συνδιασμο και εαν προσπαθησα βγαζει out of range για το "onoma" Καποια λυση ρε παιδια? Ευχαριστω
Predatorkill Δημοσ. 27 Οκτωβρίου 2021 Δημοσ. 27 Οκτωβρίου 2021 (επεξεργασμένο) Ασχετος με python αλλα μηπως πρεπει πρωτα να ξεκινησεις με το μεγαλο array και μετα το μικρο; Καποιο απο τα δυο πρεπει να ειναι το source of truth σε περιπτωση που λεω μαλακιες μηπως με intersection εκανες τη δουλεια σου; Πχ https://stackoverflow.com/questions/32391856/python-getting-the-intersection-of-two-json-files σε περιπτωση που λεω παλι μαλακιες αγνοησε με. 😂 Επεξ/σία 27 Οκτωβρίου 2021 από Predatorkill 1
k33theod Δημοσ. 28 Οκτωβρίου 2021 Δημοσ. 28 Οκτωβρίου 2021 (επεξεργασμένο) To json που βγαίνει είναι περιέργο ή κάτι έχεις γράψει λάθος. Στο names έχει id sto another exei id1 kai id2 κάτι δεν πάει καλά Γενικά στην python τρέχεις τα iteratives με for item in items και όχι με for i in range και για να πάρεις αποτελέσματα στο συγκεκριμένο πρέπει να κάνεις κάτι περίεργα μαγικά όπως στον κώδικα παρακάτω: data={ "names": [ { "id1": "12345", "id2": "6789", "name": "Onoma 1 ", "last": "Epitheto 1 ", }, { "id1": "New123455", "id2": "New6789", "name": "Onoma 2", "last": "Onoma 2" }, ], "another": [ { "name": "Onoma 1", "id": "12345" }, { "name": "Onoma 1", "id": "6789" }, { "name": "Onoma 2", "id": "New123455" }, { "name": "Onoma 2", "id": "New6789" }, ], } for item in data['another']: id = item['id'] print("sto id "+id) for item2 in data['names']: #print (item2) for value in item2.values(): if value == id: print ("antistoixei to onoma "+item2['name']) Επεξ/σία 28 Οκτωβρίου 2021 από k33theod 1
thiva7 Δημοσ. 28 Οκτωβρίου 2021 Μέλος Δημοσ. 28 Οκτωβρίου 2021 1 ώρα πριν, k33theod είπε To json που βγαίνει είναι περιέργο ή κάτι έχεις γράψει λάθος. Στο names έχει id sto another exei id1 kai id2 κάτι δεν πάει καλά Γενικά στην python τρέχεις τα iteratives με for item in items και όχι με for i in range και για να πάρεις αποτελέσματα στο συγκεκριμένο πρέπει να κάνεις κάτι περίεργα μαγικά όπως στον κώδικα παρακάτω: data={ "names": [ { "id1": "12345", "id2": "6789", "name": "Onoma 1 ", "last": "Epitheto 1 ", }, { "id1": "New123455", "id2": "New6789", "name": "Onoma 2", "last": "Onoma 2" }, ], "another": [ { "name": "Onoma 1", "id": "12345" }, { "name": "Onoma 1", "id": "6789" }, { "name": "Onoma 2", "id": "New123455" }, { "name": "Onoma 2", "id": "New6789" }, ], } for item in data['another']: id = item['id'] print("sto id "+id) for item2 in data['names']: #print (item2) for value in item2.values(): if value == id: print ("antistoixei to onoma "+item2['name']) Σε ευχαριστω για την απαντηση , το json ειναι ακριβως οπως στο γραφω η δομη του. στο κωδικα που μου εδωσες μου βγαζει αυτο for item in data['another']: TypeError: 'function' object is not subscriptable Το json κανει το συγκεκριμενο κουλο , για καθε ενα ids στο names φτιαχνει αντιστοιχα ids και στο another, δηλαδη με i οπως δοκιμαζα εγω επρεπε 0 - 0 0 - 1 1 - 2 1 - 3 2 - 4 2 - 5......με ποιο απλα λογια ρε συ στο names υπαρχει αυτο>?? "id1": "12345", // 0 - 0 "id2": "6789", // 0 - 1 Θα φτιαξει αυτο στο another { "name": "Onoma 1", "id": "12345" }, { "name": "Onoma 1", "id": "6789" },
k33theod Δημοσ. 29 Οκτωβρίου 2021 Δημοσ. 29 Οκτωβρίου 2021 (επεξεργασμένο) Πάρε την έξοδο της function και ονόμασε την data1 data1 = data()#meta for item in data1['another']: id = item['id'] print("sto id "+id) for item2 in data1['names']: #print (item2) for value in item2.values(): if value == id: print ("antistoixei to onoma "+item2['name']) Επεξ/σία 31 Οκτωβρίου 2021 από k33theod 1
DrKo Δημοσ. 29 Οκτωβρίου 2021 Δημοσ. 29 Οκτωβρίου 2021 (επεξεργασμένο) Το πρόβλημα στο από πάνω είναι ότι θέλει data['another'].values() Για να κάνεις αυτό που θες, χώρισε το dict σε δύο, στο names και στο another, ως names = data['names'] another = data['another'] Μετά, για κάθε στοιχείο του another, πάρε το κλειδί id και σύγκρινε το με τα κλειδιά του names που αρχίζουν με id ως for another_item in another.values(): id = another_item['id'] for names_item in names.values(): for k, v in names_item.items(): if k.startswith('id') and v == id: print(f'Found match: {names_item} with {another_item}') Τα αποτελέσματα μπορείς να τα αποθηκεύσεις σε μία μεταβλητή για να τα κάνεις ό,τι θέλεις μετά. Επεξ/σία 30 Οκτωβρίου 2021 από DrKo fixed code formatting 1
ralloss Δημοσ. 30 Οκτωβρίου 2021 Δημοσ. 30 Οκτωβρίου 2021 Φίλε για να πάρεις μια απάντηση που να σε διευκολύνει στο πρόβλημά σου, θα πρέπει να εξηγήσεις με σαφήνεια το πρόβλημα. Παραπάνω παραθέτεις ένα JSON με 2 arrays όπου το 2ο array (another) περιέχει την ίδια πληροφορία με το 1ο (names) σε περισσότερες εγγραφές. Τι ακριβώς θέλεις να πετύχεις συγκρίνοντας τους 2 πίνακες; Να βάλεις το πεδίο 'last' και στο another ; Αν όχι, γιατί δεν κρατάς μόνο τον πρώτο πίνακα;
thiva7 Δημοσ. 31 Οκτωβρίου 2021 Μέλος Δημοσ. 31 Οκτωβρίου 2021 Στις 29/10/2021 στις 7:03 ΠΜ, k33theod είπε Πάτε την έξοδο της function και ονόμασε την data1 data1 = data()#meta for item in data1['another']: id = item['id'] print("sto id "+id) for item2 in data1['names']: #print (item2) for value in item2.values(): if value == id: print ("antistoixei to onoma "+item2['name']) Αυτο δουλευει τελεια σε ευχαριστω πολυ 15 ώρες πριν, ralloss είπε Φίλε για να πάρεις μια απάντηση που να σε διευκολύνει στο πρόβλημά σου, θα πρέπει να εξηγήσεις με σαφήνεια το πρόβλημα. Παραπάνω παραθέτεις ένα JSON με 2 arrays όπου το 2ο array (another) περιέχει την ίδια πληροφορία με το 1ο (names) σε περισσότερες εγγραφές. Τι ακριβώς θέλεις να πετύχεις συγκρίνοντας τους 2 πίνακες; Να βάλεις το πεδίο 'last' και στο another ; Αν όχι, γιατί δεν κρατάς μόνο τον πρώτο πίνακα; Αυτο που θελω φιλε μου να παιρνω στοιχεια απο τα ενα και με το αλλο και να βγαζω ενα μονο πινακα. αυτο που εχω ανεβασει προφανώς ειναι ενα απλο αρχειο χωρις πολλα στοιχεια απλα για να καταλάβετε τι θελω , πχ στο πραγματικο αρχειο το name εχει ενα κατεβατο στοιχεια , και το another ΑΛΛΑ τοσο και χ2 κιολας απλα το another ειχει ενα στοιχειο που το χρειαζομαι στο name.
ralloss Δημοσ. 31 Οκτωβρίου 2021 Δημοσ. 31 Οκτωβρίου 2021 (επεξεργασμένο) Πάλι δεν είναι τελείως ξεκάθαρο το τοπίο. Υποθέτοντας λοιπόν, πως: - οι 2 εγγραφές στο another (που αντιστοιχούν σε 1 εγγραφή στο names) μπορεί να περιέχουν διαφορετικά πεδία μεταξύ τους, - αν τα ίδια keys που μπορεί να υπάρχουν στις 3 εγγραφές, δεν έχουν τα ίδια values μεταξύ τους, τότε υπερισχύει η τιμή του names (αν υπάρχει και στα 3) , αλλιώς υπερισχύει το id1 στο another. Με λίγα λόγα , όλα τα διαφορετικά keys που υπάρχουν σε μια εγγραφή στα 2 arrays , θα συγχωνευτούν και θα μπουν σε 1 array, όπου αν κατάλαβα καλά είναι και το ζητούμενο. data = data() # το json σου. names = data['names'] another = data['another'] new_data = [] for n in names: another_id_1 = {}; another_id_2 = {} try: another_id_1 = {k:v for k,v in [a for a in another if a['id'] == n['id1']][0].items() if k not in n.keys() and k != "id"} except: pass try: another_id_2 = {k:v for k,v in [a for a in another if a['id'] == n['id2']][0].items() if k not in n.keys() and k not in another_id_1.keys() and k != "id"} except: pass merged = { **n, **another_id_1, **another_id_2} # Python 3.5 + new_data.append(merged) #αποθήκευση σε νέο αρχείο json with open("new_data.json", "w", encoding = "utf-8") as f: f.write(json.dumps({"names":new_data})) EDIT: Ξέχασα να σημειώσω, πως το τελικό array "κρατάει" τα id1,id2 που υπάρχουν στο αρχικό names μιας και δεν ξέρω από που προκύπτουν αυτά τα ids και ποιο θέλεις να κρατήσεις. Επεξ/σία 31 Οκτωβρίου 2021 από ralloss 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα