1

I'm sure there must be a relatively easy way to do this but I'm either missing it completely or simply can't seem to grasp it. I'm usually fairly competent at finding the answer I need but I'm having no luck. Hoping someone will be able to help.

If I have the below dictionary how do I print (or return) The key, a value from a set of the nested values, and a value from the second nested set?

people = {
        "123": {
            "name": "Danny",
            "age": 100,
            "animal": "cat",
            "last_action": {
                "status": "Offline",
                "timestamp": 1664651202,
                "relative": "50 minutes ago"
            },
            "status": {
                "description": "Okay",
                "details": "",
                "state": "Okay",
                "color": "green",
                "until": 0
            },
            "number": "Six"
        },
        "456": {
            "name": "Suzy",
            "age": 42,
            "animal": dog,
            "last_action": {
                "status": "Offline",
                "timestamp": 1664636683,
                "relative": "4 hours ago"
            },
            "status": {
                "description": "Not Okay",
                "details": "",
                "state": "Okay",
                "color": "green",
                "until": 0
            },
            "number": "Twelve"
        },"789": {
            "name": "Chris",
            "age": 23,
            "animal": "horse",
            "last_action": {
                "status": "Offline",
                "timestamp": 1664636683,
                "relative": "4 hours ago"
            },
            "status": {
                "description": "Okay",
                "details": "",
                "state": "Okay",
                "color": "green",
                "until": 0
            },
            "number": "Two"
        }  

Specifically, in the above I want to print (or assign to a variable for other uses) the below;

123 Danny Okay
456 Suzy Not Okay
789 Chris Okay

I KNOW there must be a for loop for this and have tried several combinations of

key for key in people.items()
key for value in.....

I've also tried things along the lines of

numbers = people.keys()

and then using the numbers variable in the for loop as well.

I'm sorry I'm doing such a poor job of explaining the solutions I've tried but I can't access my current version at the moment and I've re-written it so many times I no longer remember them all.

It's also complicated (to me anyway) by the fact that I need the three elements as variables, so rather than just 789 Chris Okay I want {numbers}{name}{status}.

2 Answers 2

2

You could use a list comprehension over people.items():

res = [ f'{k} {v["name"]} {v["status"]["description"]}' for k, v in people.items() ]

Output:

['123 Danny Okay', '456 Suzy Not Okay', '789 Chris Okay']

Alternatively you could just iterate in a for loop:

for k, v in people.items():
    status = f'{k} {v["name"]} {v["status"]["description"]}'
    print(status)   # or do something else with it

Output:

123 Danny Okay
456 Suzy Not Okay
789 Chris Okay

Or, if you want a set of discrete variables:

number, name, status = map(list, zip(*[ (k, v["name"], v["status"]["description"]) for k, v in people.items() ]))
number
# ['123', '456', '789']
name
# ['Danny', 'Suzy', 'Chris']
status
# ['Okay', 'Not Okay', 'Okay']

Or in the for loop:

numbers = people.keys()
for number in numbers:
    name = people[number]['name']
    status = people[number]['status']['description']
    print(f'{number} {name} {status}')   # or do something else with them

Output:

123 Danny Okay
456 Suzy Not Okay
789 Chris Okay
Sign up to request clarification or add additional context in comments.

Comments

0

Below is how you can convert these into lists for each person, or into strings.

res = []

numbers = people.keys()
for inner in numbers:
  name = people[inner]["name"]
  status = people[inner]["status"]["description"]
  res.append(inner)
  res.append(name)
  res.append(status)

# Save result as lists for each person

danny = res[0:3]
suzy = res[3:6]
chris = res[6:9]

print(danny)
print(suzy)
print(chris)

# Output
# ['123', 'Danny', 'Okay']
# ['456', 'Suzy', 'Not Okay']
# ['789', 'Chris', 'Okay']

# Converts list results into strings for each person

danny_str = " ".join(danny)
suzy_str = " ".join(suzy)
chris_str = " ".join(chris)

print(danny_str)
print(suzy_str)
print(chris_str)

# Output
# 123 Danny Okay
# 456 Suzy Not Okay
# 789 Chris Okay

1 Comment

this will also be very useful, thank you so much!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.