Hi guys I have multiple conditions to check on a array of objects for example :
My sample array is like this
[{"id":1 , "type":"viw"},{"id":1 , "type":"edit"},{"id":1 , "type":"crt"}]
as these records will be in 10000's I want to calculate total sum of these in best way possible .
Currently doing like this
view_count = [element for element in user_record if element['type'] == "viw" ]
edit_count = [element for element in user_record if element['type'] == "edit"]
crt_count = [element for element in user_record if element['type'] =="crt"]
and then len(crt_count) ,len(edit_count) ,len(view_count)
which seems to me a little expensive . kindly guide can I do it in optimize way ?
and 2nd question can I use OR condition with if in this list comprehension ?
CodePudding user response:
Just collect each of the 'types' into a dictionary key and count them with it's value
result = {}
for element in user_record:
try:
result[element["type"]] = 1
except KeyError:
result[element["type"]] = 1
per comment from @Not A Robot :
"another way for essentially the same idea:"
collections.Counter(map(operator.itemgetter('type'), my_list))
Second Question: Answer is yes you can use or
like this:
edit_count = [element for element in user_record if element['type'] == "edit" or element['type'] == 'viw']
CodePudding user response:
If you're concerned with avoiding multiple iterations, just count through one iteration:
sample_arr = [{"id":1 , "type":"viw"},{"id":1 , "type":"edit"},{"id":1 , "type":"crt"}]
view_count, edit_count, crt_count = 0, 0, 0
for d in sample_arr:
if d['type'] == 'viw':
view_count = 1
elif d['type'] == 'edit':
edit_count = 1
elif d['type'] == 'crt':
crt_count = 1
CodePudding user response:
use:
d={}
for dct in sample_arr:
key = dct['type']
if d.get(key) is None:
d[key] = 0
d[key] = 1
dict(d)
{'viw': 1, 'edit': 1, 'crt': 1}
or use defaultdict
:
from collections import defaultdict
e = defaultdict(int)
for dct in sample_arr:
e[dct['type']] =1
dict(e)
{'viw': 1, 'edit': 1, 'crt': 1}
CodePudding user response:
another option without using for
loop (but using extra memory):
import pandas as pd
arr = [{"id":1 , "type":"viw"},{"id":1 , "type":"edit"},{"id":1 , "type":"crt"},
{"id":2 , "type":"viw"},{"id":2 , "type":"edit"},{"id":2 , "type":"crt"}]
df = pd.DataFrame(arr)
res = df['type'].value_counts().to_dict()
>>> res
{'viw': 2, 'edit': 2, 'crt': 2}