简体   繁体   中英

Combine pop() and setdefault() in python

I'm trying to build a method where if an item is not in a dictionary then it uses the last member of a list and updates the dictionary accordingly. Sort of like a combination of the pop and setdefault method. What I tried was the following:

dict1 = {1:2,3:4,5:6}
b = 7
c = [8,9,10]
e = dict1.setdefault(b, {}).update(pop(c))

So I would like the output to be where {7:10} gets updated to dict1, that is to say, if b is not in the keys of dict1 then the code updates dict1 with an item using b and the last item of c.

It might be possible for you to abuse a defaultdict :

from collections import defaultdict

c = [8, 9, 10]
dict1 = defaultdict(c.pop, {1: 2, 3: 4, 5: 6})
b = 7
e = dict1[b]

This will pop an item from c and make it a value of dict1 whenever a key missing from dict1 is accessed . (That means the expression dict1[b] on its own has side-effects.) There are many situations where that behaviour is more confusing than helpful, though, in which case you can opt for explicitness:

if b in dict1:
    e = dict1[b]
else:
    e = dict1[b] = c.pop()

which can of course be wrapped up in a function:

def get_or_pop(mapping, key, source):
    if key in mapping:
        v = mapping[key]
    else:
        v = mapping[key] = source.pop()

    return v

⋮
e = get_or_pop(dict1, b, c)

Considering your variables, you could use the following code snippet

dict1[b] = dict1.pop(b, c.pop())

where you are updating the dictionary "dict1" with the key "b" and the value c.pop(), (last value of the list in c, equivalent to c[-1] in this case). Note that this is possible because the key value b=7 is not in you original dictionary.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM