33

I’ve previously succeeded in parsing data from a JSON file, but now I’m facing a problem with the function I want to achieve. I have a list of names, identification numbers and birthdate in a JSON. What I want to get in Python is to be able to let a user input a name and retrieve his identification number and the birthdate (if present).

This is my JSON example file:

[
 {
   "id_number": "SA4784",
   "name": "Mark",
   "birthdate": null
 },
 {
   "id_number": "V410Z8",
   "name": "Vincent",
   "birthdate": "15/02/1989"
 },
 {
   "id_number": "CZ1094",
   "name": "Paul",
   "birthdate": "27/09/1994"
 }
]

To be clear, I want to input "V410Z8" and get his name and his birthdate.

I tried to write some code in Python but I only succeed in searching for “id_number” and not for what is inside “id_number” for example "V410Z8".

#!/usr/bin/python
# -*- coding: utf-8 -*-

import json 

database = "example.json"
data = json.loads(open(database).read())

id_number = data[0]["id_number"]
print id_number

Thank you for your support, guys :)

1

5 Answers 5

51

You have to iterate over the list of dictionaries and search for the one with the given id_number. Once you find it you can print the rest of its data and break, assuming id_number is unique.

data = [
 {
   "id_number": "SA4784",
   "name": "Mark",
   "birthdate": None
 },
 {
   "id_number": "V410Z8",
   "name": "Vincent",
   "birthdate": "15/02/1989"
 },
 {
   "id_number": "CZ1094",
   "name": "Paul",
   "birthdate": "27/09/1994"
 }
]

for i in data:
    if i['id_number'] == 'V410Z8':
        print(i['birthdate'])
        print(i['name'])
        break

If you have control over the data structure, a more efficient way would be to use the id_number as a key (again, assuming id_number is unique):

data =  { "SA4784" : {"name": "Mark", "birthdate": None},
          "V410Z8" : { "name": "Vincent", "birthdate": "15/02/1989"},
          "CZ1094" : {"name": "Paul", "birthdate": "27/09/1994"}
        }

Then all you need to do is try to access it directly:

try:
    print(data["V410Z8"]["name"])
except KeyError:
    print("ID doesn't exist")
>> "Vincent"
Sign up to request clarification or add additional context in comments.

Comments

31

Using lambda in Python

data = [
 {
   "id_number": "SA4784",
   "name": "Mark",
   "birthdate": None
 },
 {
   "id_number": "V410Z8",
   "name": "Vincent",
   "birthdate": "15/02/1989"
 },
 {
   "id_number": "CZ1094",
   "name": "Paul",
   "birthdate": "27/09/1994"
 }
]

Using Lambda and filter

print(list(filter(lambda x:x["id_number"]=="CZ1094",data)))

Output

[{'id_number': 'CZ1094', 'name': 'Paul', 'birthdate': '27/09/1994'}]

1 Comment

This literally answers the question and is what I am searching for. The accepted answer rewrites the conditions and answers that question.
11

You can use list comprehension:

Given

data = [
    {
    "id_number": "SA4784",
    "name": "Mark",
    "birthdate": None
    },
    {
    "id_number": "V410Z8",
    "name": "Vincent",
    "birthdate": "15/02/1989"
    },
    {
    "id_number": "CZ1094",
    "name": "Paul",
    "birthdate": "27/09/1994"
    }
    ]

to get the list item(s) with id_number equal to "V410Z8" you may use:

result = [x for x in data if x["id_number"]=="V410Z8"]

result will contain:

[{'id_number': 'V410Z8', 'name': 'Vincent', 'birthdate': '15/02/1989'}]

In case the if condition is not satisfied, result will contain an empty list: []

1 Comment

I'm still young in python and list comprehension isn't in my thinking pattern, but this is a great pythonic solution.
5
data = [
 {
   "id_number": "SA4784",
   "name": "Mark",
   "birthdate": None
 },
 {
   "id_number": "V410Z8",
   "name": "Vincent",
   "birthdate": "14/02/1989"
 },
 {
   "id_number": "CZ1093",
   "name": "Paul",
   "birthdate": "26/09/1994"
 }
]

list(map(lambda x:x if x["id_number"]=="cz1093" ,data)

Output should be

[{
   "id_number": "CZ1094",
   "name": "Paul",
   "birthdate": "26/09/1994"
 }]

3 Comments

Can you explain a bit more?
I have used list comprehensive using map function. If you have more detail about map function then refer this link
1

If you are only interested in one or a subset of total results, then I'd suggest a generator function as the fastest solution, since it will not unnecessarily iterate over every item regardless, and is more memory efficient:

def gen_func(data, search_term):
    for i in data:
        if i['id_number'] == search_term:
            yield i

You can then run the following to retrieve results for CZ1094:

foo = gen_func(data, 'CZ1094')
next(foo)
{'id_number': 'CZ1094', 'name': 'Paul', 'birthdate': '27/09/1994'}

NB: You'll need to handle StopIteration at end of iterable.

Comments

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.