Home > Back-end >  Create one 'list' by userID
Create one 'list' by userID

Time:09-06

I want to create a list per user so i got this jsonfile:


 data =  [
    {
      "id": "1",  
      "price": 1,   
    }, 
    {  
      "id": "1", 
      "price": 10,  
    }, 
    {
      "id": "2", 
      "price": 3, 
    }, 
    {   
      "id": "1", 
      "price": 10, 
    }, 
    {  
      "id": "2",   
      "price":8,  
    }, 
  ]

I'm on python and I want to have a result like for the user with 'id':1 [1,10,10]

and for the user with "id": "2": [3,8]

so two lists corresponding to the prices according to the ids is it possible to do that in python ?

note, in fact user id are UUID type and randomly generated.

edit: quantity was a mistake all data are price and id, sorry

CodePudding user response:

collections.defaultdict to the rescue.

Assuming you really do have mixed quantitys and prices and you don't care about mixing them into the same list,

from collections import defaultdict

data = [
    {
        "id": "1",
        "price": 1,
    },
    {
        "id": "1",
        "price": 10,
    },
    {
        "id": "2",
        "quantity": 3,
    },
    {
        "id": "1",
        "price": 10,
    },
    {
        "id": "2",
        "price": 8,
    },
]

by_id = defaultdict(list)
for item in data:
    item = item.copy()  # we need to mutate the item
    id = item.pop("id")
    # whatever is the other value in the dict, grab that:
    other_value = item.popitem()[1]
    by_id[id].append(other_value)

print(dict(by_id))

The output is

{'1': [1, 10, 10], '2': [3, 8]}

If you actually only do have prices, the loop is simpler:

by_id = defaultdict(list)
for item in data:
    by_id[item["id"]].append(item.get("price"))

or

by_id = defaultdict(list)
for item in data:
    by_id[item["id"]].append(item["price"])

to fail fast when the price is missing.

CodePudding user response:

first : you structur data : {[]}, is not supported in python. assume your data is :

my_json = [
    {
      "id": "1",  
      "price": 1,   
    }, 
    {  
      "id": "1", 
      "price": 10,  
    }, 
    {
      "id": "2", 
      "quantity": 3, 
    }, 
    {   
      "id": "1", 
      "price": 10, 
    }, 
    {  
      "id": "2",   
      "price":8,  
    }, 
  ]

then you can achive with this:

results = {}
for data in my_json:
    if data.get('id') not in results:
        results[data.get('id')] = [data.get('price') or data.get('quantity')]
    else:
        results[data.get('id')].append(data.get('price') or data.get('quantity')) 
print(results)

output:

{'1': [1, 10, 10], '2': [3, 8]}

CodePudding user response:

Maybe like this:

data = [
    {
        "id": "1",
        "price": 1,
    },
    {
        "id": "1",
        "price": 10,
    },
    {
        "id": "2",
        "quantity": 3,
    },
    {
        "id": "1",
        "price": 10,
    },
    {
        "id": "2",
        "price": 8,
    }
]

result = {}
for item in data:

    try:
        result[item['id']].append(item.get('price'))
    except KeyError:
        result[item['id']] = [item.get('price')]

print(result)

Where None is put in place of the missing price for that entry, quantity key ignored.

Result:

{'1': [1, 10, 10], '2': [None, 8]}

CodePudding user response:

A simple loop that enumerates your list (it's not JSON) in conjunction with setdefault() is all you need:

data = [
    {
        "id": "1",
        "price": 1,
    },
    {
        "id": "1",
        "price": 10,
    },
    {
        "id": "2",
        "price": 3,
    },
    {
        "id": "1",
        "price": 10,
    },
    {
        "id": "2",
        "price": 8,
    }
]

dict_ = {}

for d in data:
    dict_.setdefault(d['id'], []).append(d['price'])

print(dict_)

Output:

{'1': [1, 10, 10], '2': [3, 8]}

Note:

This will fail (KeyError) if either 'id' or 'price' is missing from the dictionaries in the list

  • Related