简体   繁体   中英

How to extract value from json and increment

Sample json is below. I want to save id which is completed (False and True) into seperated dictionaryies

todos = [{'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False},
 {'userId': 1, 'id': 2, 'title': 'quis ut nam facil ', 'completed': False},
 {'userId': 1, 'id': 1, 'title': 'fugiat veniam minus', 'completed': False},
 {'userId': 1, 'id': 2, 'title': 'et porro tempora', 'completed': True},
 {'userId': 1, 'id': 1,'title': 'laprovident illum', 'completed': False}]

Expected out is below

todos_by_user_true = {1:0,2:1}
todos_by_user_false = {1:3,2:1}

code is below? Why my code not working. I am getting blank dictionary

todos_by_user_true = {}
todos_by_user_false = {}
# Increment complete TODOs count for each user.
for todo in todos:
    if todo["completed"]==True:
        try:
            # Increment the existing user's count.
            todos_by_user_true[todo["id"]] += 1
        except KeyError:
            # This user has not been seen. Set their count to 1.
            todos_by_user_true[todo["id"]] = 0
    elif todo["completed"]==False:
        try:
            # Increment the existing user's count.
            todos_by_user_false[todo["id"]] += 1
        except KeyError:
            # This user has not been seen. Set their count to 1.
            todos_by_user_false[todo["id"]] = 0

I am getting not proper dictionary

My output is below

todos_by_user_false {1: 2, 2: 0}

todos_by_user_true {2: 0}

Disclaimer: I need to take care of exception also

Looking at your input data, it is so that: userId 1, id 1 has 0 true, and 3 false userId 1, id 2 has 1 true, and 1 false

Given the required output, it looks like you really want to use id rather than userId in your lookups. Besides that, there's an issue with accounting the first time you insert the id in the resulting dictionary. I would fix it like this:

todos_by_user_true = {}
todos_by_user_false = {}
# Increment complete TODOs count for each user.
for todo in todos:
    if todo["completed"]==True:
        try:
            # Increment the existing user's count.
            todos_by_user_true[todo["id"]] += 1
        except KeyError:
            # This user has not been seen. Set their count to 1.
            todos_by_user_true[todo["id"]] = 1
    elif todo["completed"]==False:
        try:
            # Increment the existing user's count.
            todos_by_user_false[todo["id"]] += 1
        except KeyError:
            # This user has not been seen. Set their count to 1.
            todos_by_user_false[todo["id"]] = 1

which (btw) is already what's in your comments.

Personally, I would check the dictionary for the key before insertion, instead of using try..except , like this:

todos_by_user_true = {}
todos_by_user_false = {}
# Increment complete TODOs count for each user.
for todo in todos:
    key = todo["id"]

    if todo["completed"]:  # true case
            # If `id` not there yet, insert it to 0
            if key not in todos_by_user_true:
               todos_by_user_true[key] = 0

            # increment
            todos_by_user_true[key] += 1

    else:  # false case

            # If `id` not there yet, insert it to 0
            if key not in todos_by_user_false:
               todos_by_user_false[key] = 0

            # increment
            todos_by_user_false[key] += 1

This gives out:

todos_by_user_true = {2:1}
todos_by_user_false = {1:3,2:1}

The logic being this, you cannot have: todos_by_user_true = {1:0}

You account for the value when you find it; rather than iterating for id from a separate list.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM