I am trying to read some JSON for a leaderboard for my discord bot, formatted like this:
{"915714438273826858": [ {"915714438823313420": ["", 0] }, [ {"747797252105306212": [1, 2] }, {"695390884291674153": [3, 8] } ] ] }
I can read the first part fine, but reading this list here is giving me some problems:
[ {"747797252105306212": [1, 2] }, {"695390884291674153": [3, 8] } ]
How can I read the values of each of the dictionaries in the list? For example, say I want to get the dictionary with the key "747797252105306212"
‘s sub-list, so I could get [1,2]
?
Currently, my method is to get all the keys in the larger list using
all_keys = set().union(*(d.keys() for d in lb)) all_keys = list(all_keys)
and then using the order in all_keys
to call the dictionary. For example, sometimes, all_keys shows ["747797252105306212","695390884291674153"]
, and I can call the dictionaries using the above order, as "747797252105306212"
‘s index is 0
in both all_keys
and in the JSON list. However, sometimes all_keys
is out of order, making the program call the wrong dictionary, causing this method to be obsolete. Is there any way to fix this, or a different method?
Advertisement
Answer
If I understand your issue correctly, the issue is that sets don’t maintain insertion order.
You can maintain a list (which maintains order) and a separate set (for quickly checking whether you’ve seen a key already). For each key that you see, check whether it’s a member of the set; if not, add it to the list and the seen keys set:
result = [] seen_keys = set() for item in data: for key in item: if key not in seen_keys: seen_keys.add(key) result.append(key) print(result)
With the given data, this will (deterministically!) output:
['747797252105306212', '695390884291674153']