python - position title matplotlib Fügen Sie einem Diktat nur hinzu, wenn eine Bedingung erfüllt ist



3 Answers

Um die Antwort von sqreept zu puffern, folgt hier eine Unterklasse von dict , die sich wie gewünscht verhält:

class DictNoNone(dict):
    def __setitem__(self, key, value):
        if key in self or value is not None:
            dict.__setitem__(self, key, value)


d = DictNoNone()
d["foo"] = None
assert "foo" not in d

Dadurch können die Werte vorhandener Schlüssel in None geändert werden , aber die Zuweisung von None zu einem Schlüssel, der nicht vorhanden ist, ist ein No-Op. Wenn Sie ein Element auf None , um es aus dem Wörterbuch zu entfernen , wenn es bereits vorhanden ist, können Sie Folgendes tun:

def __setitem__(self, key, value):
    if value is None:
        if key in self:
            del self[key]
    else:
        dict.__setitem__(self, key, value)

Werte von None können hineingelangen, wenn Sie sie während der Konstruktion übergeben. Wenn Sie das vermeiden möchten, fügen Sie eine Methode __init__ , um sie zu filtern:

def __init__(self, iterable=(), **kwargs):
    for k, v in iterable:
        if v is not None: self[k] = v
    for k, v in kwargs.iteritems():
        if v is not None: self[k] = v

Sie können es auch generisch machen, indem Sie es so schreiben, dass Sie die gewünschte Bedingung beim Erstellen des Wörterbuchs übergeben können:

class DictConditional(dict):
    def __init__(self, cond=lambda x: x is not None):
        self.cond = cond
    def __setitem__(self, key, value):
        if key in self or self.cond(value):
            dict.__setitem__(self, key, value)

d = DictConditional(lambda x: x != 0)
d["foo"] = 0   # should not create key
assert "foo" not in d
matplotlib figure title

Ich benutze urllib.urlencode , um Web-POST-Parameter zu erstellen, jedoch gibt es ein paar Werte, die ich nur hinzufügen möchte, wenn für sie ein anderer Wert als None existiert.

apple = 'green'
orange = 'orange'
params = urllib.urlencode({
    'apple': apple,
    'orange': orange
})

Das funktioniert gut, aber wenn ich die orange Variable optional mache, wie kann ich verhindern, dass sie zu den Parametern hinzugefügt wird? So etwas (Pseudocode):

apple = 'green'
orange = None
params = urllib.urlencode({
    'apple': apple,
    if orange: 'orange': orange
})

Ich hoffe, das war klar genug, weiß jemand, wie man das löst?




Sie können None nach der Zuweisung löschen:

apple = 'green'
orange = None
dictparams = {
    'apple': apple,
    'orange': orange
}
for k in dictparams.keys():
    if not dictparams[k]:
        del dictparams[k]
params = urllib.urlencode(dictparams)



fruits = [("apple", get_apple()), ("orange", get_orange()), ...]

params = urllib.urlencode({ fruit: val for fruit, val in fruits if val is not None })



Related