Acceda a un elemento arbitrario en un diccionario en Python



Answers

Si solo necesita acceder a un elemento (siendo el primero por casualidad, ya que los dicts no garantizan el orden) simplemente puede hacer esto en Python 2 :

my_dict.keys()[0]     -> key of "first" element
my_dict.values()[0]   -> value of "first" element
my_dict.items()[0]    -> (key, value) tuple of "first" element

Tenga en cuenta que (según mi leal saber y entender) Python no garantiza que 2 llamadas sucesivas a cualquiera de estos métodos regrese a la lista con el mismo orden. Esto no es compatible con Python3.

Question

Si un dict no está vacío, accedo a un elemento arbitrario como:

dict[dict.keys()[0]]

¿Hay alguna forma mejor de hacer esto?




Como otros mencionaron, no hay un "primer elemento", ya que los diccionarios no tienen un orden garantizado (se implementan como tablas hash). Si quiere, por ejemplo, el valor correspondiente a la clave más pequeña, thedict[min(thedict)] hará eso. Si te importa el orden en que se insertaron las claves, es decir, con "primero" te refieres a "insertado primero", entonces en Python 3.1 puedes usar collections.OrderedDict , que también está en el próximo Python 2.7; para versiones anteriores de Python, descargue, instale y use el dict backport ordenado (2.4 y posterior) que puede encontrar here .




Qué tal esto. No mencionado aquí todavía.

py 2 y 3

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2



Para Python 2 y 3:

import six

six.next(six.itervalues(d))



Siempre puedes hacer:

for k in sorted(d.keys()):
    print d[k]

Esto le proporcionará un conjunto de claves consistentemente ordenadas (con respecto al builtin .hash () supongo) que puede procesar si la clasificación tiene algún significado para usted. Eso significa, por ejemplo, que los tipos numéricos se ordenan de manera uniforme incluso si expandes el diccionario.

EJEMPLO

# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())

# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())

# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())

Tenga en cuenta que el diccionario está ordenado cuando se imprime. ¡Pero el conjunto de claves es esencialmente un hashmap!




Subclassing dict es un método, aunque no eficiente. Aquí, si proporciona un número entero, devolverá d[list(d)[n]] , de lo contrario accederá al diccionario como se esperaba:

class mydict(dict):
    def __getitem__(self, value):
        if isinstance(value, int):
            return self.get(list(self)[value])
        else:
            return self.get(value)

d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
            'e': 'test', 'f': 'dictionary', 'g': 'testing'})

d[0]    # 'hello'
d[1]    # 'this'
d['c']  # 'is'



Related