Se a mydict
não estiver vazio, eu acedo a um elemento arbitrário como:
mydict[mydict.keys()[0]]
Existe alguma maneira melhor de fazer isso?
list(mydict.keys())[0]
.
Se a mydict
não estiver vazio, eu acedo a um elemento arbitrário como:
mydict[mydict.keys()[0]]
Existe alguma maneira melhor de fazer isso?
list(mydict.keys())[0]
.
Respostas:
No Python 3, de maneira não destrutiva e iterativa:
next(iter(mydict.values()))
No Python 2, de maneira não destrutiva e iterativa:
mydict.itervalues().next()
Se você deseja que ele funcione no Python 2 e 3, você pode usar o six
pacote:
six.next(six.itervalues(mydict))
embora neste momento seja bastante enigmático e prefiro seu código.
Se você deseja remover qualquer item, faça:
key, value = mydict.popitem()
Observe que "primeiro" pode não ser um termo apropriado aqui, porque dict
não é um tipo ordenado em Python <3.6. Python 3.6+ dicts
são encomendados.
dict.iterkeys().next()
?
dict.values().__iter__().__next__()
:)
key, value = dict(d).popitem()
Se você precisar acessar apenas um elemento (sendo o primeiro por acaso, já que os dict não garantem a ordem), basta fazer isso no 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
Observe que (no melhor de meu conhecimento) o Python não garante que duas chamadas sucessivas para qualquer um desses métodos retornem a lista com a mesma ordem. Isso não é suportado no Python3.
no Python 3 :
list(my_dict.keys())[0] -> key of "first" element
list(my_dict.values())[0] -> value of "first" element
list(my_dict.items())[0] -> (key, value) tuple of "first" element
list(my_dict.keys())[0]
list(my_dict.keys())[0]
não é preguiçoso?
Em python3, o caminho:
dict.keys()
retorne um valor no tipo: dict_keys (), obteremos um erro ao obter o 1º membro das chaves do dict dessa maneira:
dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
Finalmente, eu converti dict.keys () para list @ 1st e obtive o 1º membro pelo método de emenda de lista:
list(dict.keys())[0]
list(dict.values())[0]
.
Como outros mencionados, não há "primeiro item", pois os dicionários não têm ordem garantida (eles são implementados como tabelas de hash). Se você quiser, por exemplo, o valor correspondente à menor chave, thedict[min(thedict)]
fará isso. Se você se importa com a ordem em que as chaves foram inseridas, ou seja, por "primeiro" você quer dizer "inserido mais cedo", no Python 3.1 você pode usar coleções.OrderedDict , que também está no Python 2.7; para versões mais antigas do Python, baixe, instale e use o dict backport ordenado (2.4 e posterior) que você pode encontrar aqui .
Python 3.7 Agora os ditados são ordenados por inserção.
Que tal agora. Ainda não mencionado aqui.
py 2 e 3
a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
dict.values()
retorna uma visualização, então deve ser O (1). list(a)
retorna uma nova lista, assim seria O (n).
Ignorando os problemas relacionados à ordenação de ditados, isso pode ser melhor:
next(dict.itervalues())
Dessa forma, evitamos a pesquisa de itens e geramos uma lista de chaves que não usamos.
next(iter(dict.values()))
next(iter(dict.values()))
obter o mesmo resultado sem criar a lista.
Em python3
list(dict.values())[0]
Você sempre pode fazer:
for k in sorted(d.keys()):
print d[k]
Isto lhe dará um consistentemente classificada (com respeito ao builtin set .hash () eu acho) de teclas que pode processar em se a ordenação tem algum significado para você. Isso significa que, por exemplo, os tipos numéricos são classificados de forma consistente, mesmo se você expandir o dicionário.
EXEMPLO
# 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())
Observe que o dicionário é classificado quando impresso. Mas o conjunto de chaves é essencialmente um hashmap!
Para o Python 2 e 3:
import six
six.next(six.itervalues(d))
Is there any better way to do this?
maneira curta.
first_key, *rest_keys = mydict
Nenhuma biblioteca externa funciona em Python 2.7 e 3.x:
>>> list(set({"a":1, "b": 2}.values()))[0]
1
Para chave arbitrária, deixe de fora .values ()
>>> list(set({"a":1, "b": 2}))[0]
'a'
A subclassificação dict
é um método, embora não seja eficiente. Aqui, se você fornecer um número inteiro, ele retornará d[list(d)[n]]
; caso contrário, acesse o dicionário conforme o esperado:
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'