Jeśli a mydict
nie jest puste, uzyskuję dostęp do dowolnego elementu jako:
mydict[mydict.keys()[0]]
Czy jest na to lepszy sposób?
list(mydict.keys())[0]
.
Jeśli a mydict
nie jest puste, uzyskuję dostęp do dowolnego elementu jako:
mydict[mydict.keys()[0]]
Czy jest na to lepszy sposób?
list(mydict.keys())[0]
.
Odpowiedzi:
W Pythonie 3, nieniszczący i iteracyjny:
next(iter(mydict.values()))
W Pythonie 2, nieniszczący i iteracyjny:
mydict.itervalues().next()
Jeśli chcesz, aby działał zarówno w Pythonie 2, jak i 3, możesz użyć six
pakietu:
six.next(six.itervalues(mydict))
choć w tym momencie jest to dość tajemnicze i wolałbym twój kod.
Jeśli chcesz usunąć dowolny element, wykonaj:
key, value = mydict.popitem()
Zauważ, że „pierwszy” może nie być tutaj odpowiednim terminem, ponieważ dict
nie jest uporządkowanym typem w Pythonie <3.6. Python 3.6+ dicts
są zamawiane.
dict.iterkeys().next()
?
dict.values().__iter__().__next__()
:)
key, value = dict(d).popitem()
Jeśli potrzebujesz tylko dostępu do jednego elementu (jest to pierwszy przypadek, ponieważ dyktaty nie gwarantują zamówienia), możesz to po prostu zrobić w Pythonie 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
Należy pamiętać, że (według mojej najlepszej wiedzy) Python nie gwarantuje, że 2 kolejne wywołania którejkolwiek z tych metod zwrócą listę z tą samą kolejnością. Nie jest to obsługiwane w Python3.
w Pythonie 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]
nie jest leniwy?
W python3 sposób:
dict.keys()
zwróć wartość typu: dict_keys (), otrzymamy błąd, gdy otrzymamy 1. element klucza dict w ten sposób:
dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
Na koniec przekonwertowałem dict.keys () na list @ 1st i uzyskałem 1. członka metodą łączenia list:
list(dict.keys())[0]
list(dict.values())[0]
.
Jak wspomniano inni, nie ma „pierwszego elementu”, ponieważ słowniki nie mają gwarantowanej kolejności (są implementowane jako tabele skrótów). Jeśli chcesz na przykład wartość odpowiadającą najmniejszemu kluczowi, thedict[min(thedict)]
zrobisz to. Jeśli zależy ci na kolejności, w jakiej klucze zostały wstawione, tzn. „Pierwszy” oznacza „wstawiony najwcześniej”, to w Pythonie 3.1 możesz używać kolekcji.OrDERDict , który jest również w nadchodzącym Pythonie 2.7; w przypadku starszych wersji Pythona pobierz, zainstaluj i użyj zamówionego backportu dict (2.4 i nowszych), który można znaleźć tutaj .
Python 3.7 Teraz dyktanda są uporządkowane przy wstawianiu.
Co powiesz na to. Nie wspomniano tu jeszcze.
py 2 i 3
a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
dict.values()
zwraca widok, więc powinno być O (1). list(a)
zwraca nową listę, więc byłoby O (n).
Zignorowanie problemów związanych z kolejnością nagrań może być lepsze:
next(dict.itervalues())
W ten sposób unikamy wyszukiwania elementów i generowania listy kluczy, których nie używamy.
next(iter(dict.values()))
next(iter(dict.values()))
uzyskać ten sam wynik bez tworzenia listy.
W python3
list(dict.values())[0]
Zawsze możesz zrobić:
for k in sorted(d.keys()):
print d[k]
To da ci konsekwentnie posortowany (w odniesieniu do wbudowanego .hash () chyba) zestaw kluczy, które możesz przetwarzać, jeśli sortowanie ma dla ciebie jakieś znaczenie. Oznacza to, że na przykład typy liczbowe są sortowane konsekwentnie, nawet jeśli rozszerzysz słownik.
PRZYKŁAD
# 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())
Pamiętaj, że słownik jest sortowany po wydrukowaniu. Ale zestaw kluczy to w zasadzie skrót!
Zarówno dla Python 2, jak i 3:
import six
six.next(six.itervalues(d))
Is there any better way to do this?
w skrócie.
first_key, *rest_keys = mydict
Brak bibliotek zewnętrznych, działa zarówno w Pythonie 2.7, jak i 3.x:
>>> list(set({"a":1, "b": 2}.values()))[0]
1
W przypadku klucza aribtrary po prostu pomiń .values ()
>>> list(set({"a":1, "b": 2}))[0]
'a'
Podklasowanie dict
jest jedną z metod, choć nieefektywną. Tutaj, jeśli podasz liczbę całkowitą, ona zwróci d[list(d)[n]]
, w przeciwnym razie uzyskaj dostęp do słownika zgodnie z oczekiwaniami:
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'