Hoe kan ik nieuwe sleutels aan een woordenboek toevoegen?

Is het mogelijk om een ​​sleutel toe te voegen aan een Python-woordenboek nadat het is gemaakt?

Het lijkt geen .add() methode te hebben.


Antwoord 1, autoriteit 100%

U maakt een nieuw sleutel/waarde-paar in een woordenboek door een waarde aan die sleutel toe te kennen

d = {'key': 'value'}
print(d)  # {'key': 'value'}
d['mynewkey'] = 'mynewvalue'
print(d)  # {'key': 'value', 'mynewkey': 'mynewvalue'}

Als de sleutel niet bestaat, wordt deze toegevoegd en verwijst naar die waarde. Als het bestaat, wordt de huidige waarde waarnaar het verwijst overschreven.


Antwoord 2, autoriteit 29%

Als u meerdere sleutels tegelijk wilt toevoegen, gebruikt u dict.update():

>>> x = {1:2}
>>> print(x)
{1: 2}
>>> d = {3:4, 5:6, 7:8}
>>> x.update(d)
>>> print(x)
{1: 2, 3: 4, 5: 6, 7: 8}

Voor het toevoegen van een enkele sleutel heeft het geaccepteerde antwoord minder rekenkundige overhead.


Antwoord 3, autoriteit 29%

Ik heb zin om informatie over Python-woordenboeken te consolideren:

Een leeg woordenboek maken

data = {}
# OR
data = dict()

Een woordenboek maken met beginwaarden

data = {'a': 1, 'b': 2, 'c': 3}
# OR
data = dict(a=1, b=2, c=3)
# OR
data = {k: v for k, v in (('a', 1), ('b',2), ('c',3))}

Een enkele waarde invoegen/bijwerken

data['a'] = 1  # Updates if 'a' exists, else adds 'a'
# OR
data.update({'a': 1})
# OR
data.update(dict(a=1))
# OR
data.update(a=1)

Meerdere waarden invoegen/bijwerken

data.update({'c':3,'d':4})  # Updates 'c' and adds 'd'

Python 3.9+:

De update-operator |= werkt nu voor woordenboeken:

data |= {'c':3,'d':4}

Een samengevoegd woordenboek maken zonder de originelen te wijzigen

data3 = {}
data3.update(data)  # Modifies data3, not data
data3.update(data2)  # Modifies data3, not data2

Python 3.5+:

Dit gebruikt een nieuwe functie genaamd woordenboek uitpakken.

data = {**data1, **data2, **data3}

Python 3.9+:

De samenvoegoperator | werkt nu voor woordenboeken:

data = data1 | {'c':3,'d':4}

Items in woordenboek verwijderen

del data[key]  # Removes specific element in a dictionary
data.pop(key)  # Removes the key & returns the value
data.clear()  # Clears entire dictionary

Controleer of een sleutel al in het woordenboek staat

key in data

Herhaal door paren in een woordenboek

for key in data: # Iterates just through the keys, ignoring the values
for key, value in d.items(): # Iterates through the pairs
for key in d.keys(): # Iterates just through key, ignoring the values
for value in d.values(): # Iterates just through value, ignoring the keys

Maak een woordenboek van twee lijsten

data = dict(zip(list_with_keys, list_with_values))

Antwoord 4, autoriteit 4%

"Is het mogelijk om een ​​sleutel toe te voegen aan een Python-woordenboek nadat het is gemaakt? Het lijkt geen .add() methode te hebben."

Ja, het is mogelijk, en het heeft een methode die dit implementeert, maar je wilt het niet direct gebruiken.

Om te demonstreren hoe en hoe het niet te gebruiken, laten we een leeg dictaat maken met het letterlijke dict, {}:

my_dict = {}

Best Practice 1: Subscriptnotatie

Als je dit dictaat wilt bijwerken met een enkele nieuwe sleutel en waarde, kun je de subscriptnotatie (zie Mappings hier) die voorziet in itemtoewijzing:

my_dict['new key'] = 'new value'

my_dict is nu:

{'new key': 'new value'}

Best Practice 2: De update-methode – 2 manieren

We kunnen het dictaat ook efficiënt bijwerken met meerdere waarden met behulp van de update methode. Mogelijk maken we hier onnodig een extra dict aan, dus we hopen dat ons dict al is gemaakt en afkomstig is van of is gebruikt voor een ander doel:

my_dict.update({'key 2': 'value 2', 'key 3': 'value 3'})

my_dict is nu:

{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value'}

Een andere efficiënte manier om dit te doen met de update-methode is met trefwoordargumenten, maar aangezien het legitieme pythonwoorden moeten zijn, mag je geen spaties of speciale symbolen gebruiken of de naam beginnen met een nummer, maar velen beschouwen dit als een leesbare manier om sleutels voor een dictaat te maken, en hier vermijden we zeker het maken van een extra onnodig dict:

my_dict.update(foo='bar', foo2='baz')

en my_dict is nu:

{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value', 
 'foo': 'bar', 'foo2': 'baz'}

Dus nu hebben we drie Pythonische manieren besproken om een ​​dict bij te werken.


Magische methode, __setitem__, en waarom deze moet worden vermeden

Er is een andere manier om een ​​dict bij te werken die u niet zou moeten gebruiken, en die gebruikt de __setitem__ methode. Hier is een voorbeeld van hoe men de __setitem__ methode zou kunnen gebruiken om een ​​sleutel-waardepaar toe te voegen aan een dict, en een demonstratie van de slechte prestaties van het gebruik ervan:

>>> d = {}
>>> d.__setitem__('foo', 'bar')
>>> d
{'foo': 'bar'}
>>> def f():
...     d = {}
...     for i in xrange(100):
...         d['foo'] = i
... 
>>> def g():
...     d = {}
...     for i in xrange(100):
...         d.__setitem__('foo', i)
... 
>>> import timeit
>>> number = 100
>>> min(timeit.repeat(f, number=number))
0.0020880699157714844
>>> min(timeit.repeat(g, number=number))
0.005071878433227539

We zien dus dat het gebruik van de subscript-notatie eigenlijk veel sneller is dan het gebruik van __setitem__. Het Pythonic-ding doen, dat wil zeggen, de taal gebruiken op de manier waarop het bedoeld was om te worden gebruikt, is meestal zowel leesbaarder als rekenkundig efficiënter.


Antwoord 5, autoriteit 3%

dictionary[key] = value

Antwoord 6, autoriteit 2%

Als u een woordenboek aan een woordenboek wilt toevoegen, kunt u dat op deze manier doen.

Voorbeeld: voeg een nieuw item toe aan uw woordenboek & subwoordenboek

dictionary = {}
dictionary["new key"] = "some new entry" # add new dictionary entry
dictionary["dictionary_within_a_dictionary"] = {} # this is required by python
dictionary["dictionary_within_a_dictionary"]["sub_dict"] = {"other" : "dictionary"}
print (dictionary)

Uitvoer:

{'new key': 'some new entry', 'dictionary_within_a_dictionary': {'sub_dict': {'other': 'dictionarly'}}}

OPMERKING: Python vereist dat je eerst een sub toevoegt

dictionary["dictionary_within_a_dictionary"] = {}

voordat u items toevoegt.


Antwoord 7

De conventionele syntaxis is d[key] = value, maar als uw toetsenbord de vierkante haakjestoetsen mist, kunt u ook het volgende doen:

d.__setitem__(key, value)

In feite is het definiëren van de methoden __getitem__ en __setitem__ hoe u ervoor kunt zorgen dat uw eigen klasse de syntaxis van vierkante haakjes ondersteunt. Zie Dive Into Python, 5.6. Speciale lesmethoden.


Antwoord 8

U kunt er een maken:

class myDict(dict):
    def __init__(self):
        self = dict()
    def add(self, key, value):
        self[key] = value
## example
myd = myDict()
myd.add('apples',6)
myd.add('bananas',3)
print(myd)

Geeft:

>>> 
{'apples': 6, 'bananas': 3}

Antwoord 9

Deze populaire vraag adresseert functionele methoden voor het samenvoegen van woordenboeken a en b.

Hier zijn enkele van de meer rechttoe rechtaan methoden (getest in Python 3)…

c = dict( a, **b ) ## see also https://stackoverflow.com/q/2255878
c = dict( list(a.items()) + list(b.items()) )
c = dict( i for d in [a,b] for i in d.items() )

Opmerking: de eerste methode hierboven werkt alleen als de toetsen in b strings zijn.

Als u een enkel element wilt toevoegen of wijzigen, zou het woordenboek b alleen dat ene element bevatten…

c = dict( a, **{'d':'dog'} ) ## returns a dictionary based on 'a'

Dit komt overeen met…

def functional_dict_add( dictionary, key, value ):
   temp = dictionary.copy()
   temp[key] = value
   return temp
c = functional_dict_add( a, 'd', 'dog' )

Antwoord 10

Laten we doen alsof u in de onveranderlijke wereld wilt leven en niet het origineel wilt wijzigen, maar een nieuw dict wilt maken dat het resultaat is van het toevoegen van een nieuwe sleutel tot het origineel.

In Python 3.5+ kun je het volgende doen:

params = {'a': 1, 'b': 2}
new_params = {**params, **{'c': 3}}

Het equivalent van Python 2 is:

params = {'a': 1, 'b': 2}
new_params = dict(params, **{'c': 3})

Na een van deze:

params is nog steeds gelijk aan {'a': 1, 'b': 2}

en

new_params is gelijk aan {'a': 1, 'b': 2, 'c': 3}

Er zullen momenten zijn waarop u het origineel niet wilt wijzigen (u wilt alleen het resultaat van het toevoegen aan het origineel). Ik vind dit een verfrissend alternatief voor het volgende:

params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params['c'] = 3

of

params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params.update({'c': 3})

Referentie: Wat betekent `* *` betekenen in de uitdrukking `dict(d1, **d2)`?


Antwoord 11

Er is ook de vreemd genoemde, vreemd gedragen en toch handige dict.setdefault().

Dit

value = my_dict.setdefault(key, default)

doet eigenlijk gewoon dit:

try:
    value = my_dict[key]
except KeyError: # key not found
    value = my_dict[key] = default

Bijvoorbeeld,

>>> mydict = {'a':1, 'b':2, 'c':3}
>>> mydict.setdefault('d', 4)
4 # returns new value at mydict['d']
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # a new key/value pair was indeed added
# but see what happens when trying it on an existing key...
>>> mydict.setdefault('a', 111)
1 # old value was returned
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # existing key was ignored

Antwoord 12

Als u niet twee woordenboeken samenvoegt, maar nieuwe sleutel-waardeparen aan een woordenboek toevoegt, lijkt het gebruik van de subscriptnotatie de beste manier.

import timeit
timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary.update({"aaa": 123123, "asd": 233})')
>> 0.49582505226135254
timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary["aaa"] = 123123; dictionary["asd"] = 233;')
>> 0.20782899856567383

Als u echter bijvoorbeeld duizenden nieuwe sleutel-waardeparen wilt toevoegen, kunt u overwegen de methode update() te gebruiken.


Antwoord 13

Hier is nog een manier die ik hier niet heb gezien:

>>> foo = dict(a=1,b=2)
>>> foo
{'a': 1, 'b': 2}
>>> goo = dict(c=3,**foo)
>>> goo
{'c': 3, 'a': 1, 'b': 2}

U kunt de woordenboekconstructor en impliciete uitbreiding gebruiken om een ​​woordenboek te reconstrueren. Bovendien is het interessant dat deze methode kan worden gebruikt om de positievolgorde te bepalen tijdens het bouwen van woordenboeken (post Python 3.6). In feite is de invoegvolgorde gegarandeerd voor Python 3.7 en hoger!

>>> foo = dict(a=1,b=2,c=3,d=4)
>>> new_dict = {k: v for k, v in list(foo.items())[:2]}
>>> new_dict
{'a': 1, 'b': 2}
>>> new_dict.update(newvalue=99)
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99}
>>> new_dict.update({k: v for k, v in list(foo.items())[2:]})
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99, 'c': 3, 'd': 4}
>>> 

Het bovenstaande maakt gebruik van woordenboekbegrip.


Antwoord 14

Eerst controleren of de sleutel al bestaat:

a={1:2,3:4}
a.get(1)
2
a.get(5)
None

Vervolgens kunt u de nieuwe sleutel en waarde toevoegen.


Antwoord 15

Ik denk dat het ook nuttig zou zijn om te wijzen op de collections module die bestaat uit veel handige woordenboeksubklassen en wrappers die het toevoegen en wijzigen van gegevenstypen in een woordenboek vereenvoudigen, met name defaultdict:

dict subklasse die een fabrieksfunctie aanroept om ontbrekende waarden op te geven

Dit is vooral handig als u werkt met woordenboeken die altijd uit dezelfde gegevenstypen of structuren bestaan, bijvoorbeeld een woordenboek met lijsten.

>>> from collections import defaultdict
>>> example = defaultdict(int)
>>> example['key'] += 1
>>> example['key']
defaultdict(<class 'int'>, {'key': 1})

Als de sleutel nog niet bestaat, wijst defaultdict de gegeven waarde (in ons geval 10) toe als de beginwaarde aan het woordenboek (vaak gebruikt in lussen). Deze bewerking doet dus twee dingen: het voegt een nieuwe sleutel toe aan een woordenboek (volgens vraag), en wijst de waarde toe als de sleutel nog niet bestaat. Met de standaardwoordenboek, zou dit een fout hebben opgeleverd omdat de bewerking += probeert toegang te krijgen tot een waarde die nog niet bestaat:

>>> example = dict()
>>> example['key'] += 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'key'

Zonder het gebruik van defaultdict, zou de hoeveelheid code om een ​​nieuw element toe te voegen veel groter zijn en er misschien ongeveer zo uitzien:

# This type of code would often be inside a loop
if 'key' not in example:
    example['key'] = 0  # add key and initial value to dict; could also be a list
example['key'] += 1  # this is implementing a counter

defaultdict kan ook worden gebruikt met complexe gegevenstypen zoals list en set:

>>> example = defaultdict(list)
>>> example['key'].append(1)
>>> example
defaultdict(<class 'list'>, {'key': [1]})

Als je een element toevoegt, wordt de lijst automatisch geïnitialiseerd.


Antwoord 16

Hier is een gemakkelijke manier!

your_dict = {}
your_dict['someKey'] = 'someValue'

Hierdoor wordt een nieuw key: value-paar toegevoegd aan het your_dict-woordenboek met key = someKey en value = somevalue

Je kunt deze manier ook gebruiken om de waarde van de sleutel somekey bij te werken als die al bestaat in de your_dict.


Antwoord 17

Voeg een woordenboek (key,value) klasse toe.

class myDict(dict):
    def __init__(self):
        self = dict()
    def add(self, key, value):
        #self[key] = value # add new key and value overwriting any exiting same key
        if self.get(key)!=None:
            print('key', key, 'already used') # report if key already used
        self.setdefault(key, value) # if key exit do nothing
## example
myd = myDict()
name = "fred"
myd.add('apples',6)
print('\n', myd)
myd.add('bananas',3)
print('\n', myd)
myd.add('jack', 7)
print('\n', myd)
myd.add(name, myd)
print('\n', myd)
myd.add('apples', 23)
print('\n', myd)
myd.add(name, 2)
print(myd)

Antwoord 18

U kunt vierkante haken gebruiken:

my_dict = {}
my_dict["key"] = "value"

Of je kunt de .update() methode gebruiken:

my_another_dict = {"key": "value"}
my_dict = {}
my_dict.update(my_another_dict)

Antwoord 19

your_dict = {}

Een nieuwe sleutel toevoegen:

  1. your_dict[key]=value

  2. your_dict.update(key=value)

LEAVE A REPLY

Please enter your comment!
Please enter your name here

17 + four =

Other episodes