Search code examples
python-2.7dictionarydictionary-comprehension

Create dict try comprehension


This:

index ={}
for item in args:
    for array in item:
        for k,v in json.loads(array).iteritems():
            for value in v:
                index.setdefault(k,[]).append({'values':value['id']})

Works

But, when I try this:

index ={}
filt = {index.setdefault(k,[]).append(value['id']) for item in args for array in item for (k,v) in json.loads(array).iteritems() for value in v}
print filt

Output:

result set([None])

Whats wrong?


Solution

  • dict.setdefault is an inplace method that returns None so you are creating a set of None's which as sets cannot have duplicates leave you with set([None]):

    In [27]: d = {}
    
    In [28]: print(d.setdefault(1,[]).append(1)) # returns None
    None 
    In [35]: d = {}
    
    In [36]: {d.setdefault(k,[]).append(1) for k in range(2)} # a set comprehension 
    Out[36]: {None}
    
    In [37]: d
    Out[37]: {0: [1], 1: [1]}
    

    The index dict like d above would get updated but using any comprehension for side effects is not a good approach. You also cannot replicate the for loops/setdefault logic even using a dict comprehension.

    What you could do is use a defaultdict with list.extend:

    from collections import defaultdict
    
    index = defaultdict(list)
    for item in args:
        for array in item:
            for k,v in json.loads(array).iteritems():
                index[k].extend({'values':value['id']} for value in v)