Jak wydrukować klucz słownika?


213

Chciałbym wydrukować określony klucz słownika Python:

mydic = {}
mydic['key_name'] = 'value_name'

Teraz mogę sprawdzić, czy mydic.has_key('key_name'), ale chciałbym wydrukować nazwę klucza 'key_name'. Oczywiście, że mógłbym użyć mydic.items(), ale nie chcę, aby wszystkie klucze były wymienione, tylko jeden konkretny klucz. Na przykład oczekiwałbym czegoś takiego (w pseudokodzie):

print "the key name is", mydic['key_name'].name_the_key(), "and its value is", mydic['key_name']

Czy istnieje name_the_key()metoda wydrukowania nazwy klucza?


Edycja: OK, dziękuję bardzo za wasze reakcje! :) Zdaję sobie sprawę, że moje pytanie nie jest dobrze sformułowane i trywialne. Właśnie się pomyliłem, ponieważ zdałem sobie sprawę, że nazwa_klucza mydic['key_name']to dwie różne rzeczy i pomyślałem, że niepoprawne byłoby wydrukowanie key_namepoza kontekstem słownika. Ale rzeczywiście mogę po prostu użyć „nazwa_klucza”, aby odnieść się do klucza! :)


19
Jeśli wiesz, jaki konkretny klucz chcesz, umm, już wiesz, co to jest klucz.
Wooble,

Odpowiedzi:


382

Słownik ma z definicji dowolną liczbę kluczy. Nie ma „klucza”. Masz keys()metodę, która daje python listwszystkich kluczy, i masz iteritems()metodę, która zwraca pary klucz-wartość, więc

for key, value in mydic.iteritems() :
    print key, value

Wersja Python 3:

for key, value in mydic.items() :
    print (key, value)

Więc masz uchwyt na klawiszach, ale one naprawdę mają sens tylko w połączeniu z wartością. Mam nadzieję, że zrozumiałem twoje pytanie.


1
Chociaż działało to dla mnie pięknie w Pythonie 2.7, jaka jest alternatywa w Py3k? Wiem, że .iteritems()nie jest już obsługiwany ...
piperchester

5
@PolyShell alternatywa w Pythonie 3, jeśli to masz na myśli przez Py3k (od jakiegoś czasu jestem z dala od Pythona) to .items(). Dodałem przykład.
juanchopanza

1
@Bibhas Oba działają, ale semantyka jest inna. items()zwraca listę w python 2.x.
juanchopanza

72

Dodatkowo możesz użyć ....

print(dictionary.items()) #prints keys and values
print(dictionary.keys()) #prints keys
print(dictionary.values()) #prints values

Dzięki! Właśnie tego dokładnie szukałem :)
Masoud Maleki

34

Hmm, myślę, że możesz chcieć wydrukować wszystkie klucze w słowniku i odpowiadające im wartości?

Jeśli tak, chcesz:

for key in mydic:
  print "the key name is" + key + "and its value is" + mydic[key]

Upewnij się, że używasz również „+” zamiast „”. Przecinek umieści każdy z tych elementów w osobnej linii, myślę, że jako plus umieści je w tej samej linii.


2
przecinek pozostawi je w tej samej linii, ale wstaw spacje między "is"i keyitp. Jeśli używasz +, musisz wstawić dodatkowe dopełnienie do łańcuchów. Również klucz i wartość niekoniecznie są łańcuchami, w którym to przypadku przecinek użyje str (klucz) i str (wartość), a +spowoduje błąd
John La Rooy

1
To jedna odpowiedź, którą wiem, że nie jest właściwa, ponieważ OP powiedział: „Nie chcę, aby wszystkie klucze były wymienione”.
Ned Batchelder

Z jakiegoś powodu pomyślałem inaczej o przecinku; masz rację w tej sprawie. Ponownie przeczytałem pytanie, wygląda na to, że oboje pogrubiliśmy „wszystko” - moje złe.
Dominic Santos

32
dic = {"key 1":"value 1","key b":"value b"}

#print the keys:
for key in dic:
    print key

#print the values:
for value in dic.itervalues():
    print value

#print key and values
for key, value in dic.iteritems():
    print key, value

Uwaga: W Pythonie 3 zmieniono nazwę dic.iteritems () na dic.items ()


25

Nazwa klucza „nazwa_klucza” to nazwa_klucza print 'key_name'lub dowolna zmienna, którą reprezentujesz.


10

W Pythonie 3:

# A simple dictionary
x = {'X':"yes", 'Y':"no", 'Z':"ok"}

# To print a specific key (for example key at index 1)
print([key for key in x.keys()][1])

# To print a specific value (for example value at index 1)
print([value for value in x.values()][1])

# To print a pair of a key with its value (for example pair at index 2)
print(([key for key in x.keys()][2], [value for value in x.values()][2]))

# To print a key and a different value (for example key at index 0 and value at index 1)
print(([key for key in x.keys()][0], [value for value in x.values()][1]))

# To print all keys and values concatenated together
print(''.join(str(key) + '' + str(value) for key, value in x.items()))

# To print all keys and values separated by commas
print(', '.join(str(key) + ', ' + str(value) for key, value in x.items()))

# To print all pairs of (key, value) one at a time
for e in range(len(x)):
    print(([key for key in x.keys()][e], [value for value in x.values()][e]))

# To print all pairs (key, value) in a tuple
print(tuple(([key for key in x.keys()][i], [value for value in x.values()][i]) for i in range(len(x))))

8

Ponieważ wszyscy próbujemy odgadnąć, co może oznaczać „wypisz klucz”, postaram się to zrobić. Być może potrzebujesz funkcji, która pobiera wartość ze słownika i znajduje odpowiedni klucz? Odwrotne wyszukiwanie?

def key_for_value(d, value):
    """Return a key in `d` having a value of `value`."""
    for k, v in d.iteritems():
        if v == value:
            return k

Zauważ, że wiele kluczy może mieć tę samą wartość, więc ta funkcja zwróci jakiś klucz o wartości, być może nie taki, jaki chciałeś.

Jeśli musisz to robić często, warto zbudować słownik odwrotny:

d_rev = dict(v,k for k,v in d.iteritems())

Zauważ (jak wyżej), że iterity stały się po prostu „elementami” w Pythonie 3.
Mike

Uwaga: jeśli zmienisz iteritemsna items, to jak pierwotnie pokazano, odpowiedź zwróci tylko pierwszy klucz - jeśli istnieje wiele dopasowań. Aby rozwiązać ten problem, utwórz pustą listę przed for loop( values_list = []), a następnie dodaj klucze do tej listy ( values_list.append(k)) w ifpętli. Na koniec przenieś instrukcję return ( return values_list) poza forpętlę.
Victoria Stuart,


4
# highlighting how to use a named variable within a string:
mapping = {'a': 1, 'b': 2}

# simple method:
print(f'a: {mapping["a"]}')
print(f'b: {mapping["b"]}')

# programmatic method:
for key, value in mapping.items():
    print(f'{key}: {value}')

# yields:
# a 1
# b 2

# using list comprehension
print('\n'.join(f'{key}: {value}' for key, value in dict.items()))


# yields:
# a: 1
# b: 2

Edycja: Zaktualizowano dla f-stringów Pythona 3 ...


3

Upewnij się, że zrobisz

dictionary.keys()
# rather than
dictionary.keys

2

Co jest złego w używaniu 'key_name'zamiast tego, nawet jeśli jest to zmienna?



1
dict = {'name' : 'Fred', 'age' : 100, 'employed' : True }

# Choose key to print (could be a user input)
x = 'name'

if x in dict.keys():
    print(x)

1

Prawdopodobnie najszybszy sposób na odzyskanie tylko nazwy klucza:

mydic = {}
mydic['key_name'] = 'value_name'

print mydic.items()[0][0]

Wynik:

key_name

Konwertuje dictionaryna a listnastępnie wyświetla pierwszy element, który jest całością, dicta następnie wyświetla pierwszą wartość tego elementu, który jest:key_name


Po co jednak odzyskiwać tę wartość?
Martijn Pieters

1

Odszukałem to pytanie, ponieważ chciałem wiedzieć, jak odzyskać nazwę „klucza”, jeśli mój słownik ma tylko jeden wpis. W moim przypadku klucz był mi nieznany i może być dowolną liczbą rzeczy. Oto, co wymyśliłem:

dict1 = {'random_word': [1,2,3]}
key_name = str([key for key in dict1]).strip("'[]'")        
print(key_name)  # equal to 'random_word', type: string.

0

Spróbuj tego:

def name_the_key(dict, key):
    return key, dict[key]

mydict = {'key1':1, 'key2':2, 'key3':3}

key_name, value = name_the_key(mydict, 'key2')
print 'KEY NAME: %s' % key_name
print 'KEY VALUE: %s' % value

0
key_name = '...'
print "the key name is %s and its value is %s"%(key_name, mydic[key_name])

0

Jeśli chcesz uzyskać klucz o pojedynczej wartości, pomocne byłyby następujące czynności:

def get_key(b): # the value is passed to the function
    for k, v in mydic.items():
        if v.lower() == b.lower():
            return k

W pythonowy sposób:

c = next((x for x, y in mydic.items() if y.lower() == b.lower()), \
     "Enter a valid 'Value'")
print(c)

0

Dodaję tę odpowiedź jako jedną z innych odpowiedzi tutaj ( https://stackoverflow.com/a/5905752/1904943 ) jest datowana (Python 2; iteritems), a przedstawiony kod - jeśli jest aktualizowany dla Python 3 zgodnie z sugerowanym obejście w komentarzu do tej odpowiedzi - po cichu nie zwraca wszystkich istotnych danych.


tło

Mam pewne dane metaboliczne, przedstawione na wykresie (węzły, krawędzie, ...). W słownikowej reprezentacji tych danych klucze mają postać (604, 1037, 0)(reprezentującą węzeł źródłowy i docelowy oraz typ krawędzi), z wartościami formy 5.3.1.9(reprezentującymi kody enzymów EC).

Znajdź klucze dla podanych wartości

Poniższy kod poprawnie znajduje moje klucze, podając wartości:

def k4v_edited(my_dict, value):
    values_list = []
    for k, v in my_dict.items():
        if v == value:
            values_list.append(k)
    return values_list

print(k4v_edited(edge_attributes, '5.3.1.9'))
## [(604, 1037, 0), (604, 3936, 0), (1037, 3936, 0)]

podczas gdy ten kod zwraca tylko pierwszy (z kilku możliwych pasujących) kluczy:

def k4v(my_dict, value):
    for k, v in my_dict.items():
        if v == value:
            return k

print(k4v(edge_attributes, '5.3.1.9'))
## (604, 1037, 0)

Ten ostatni kod, naiwnie aktualizowane wymianie iteritemsz items, nie zwróci (604, 3936, 0), (1037, 3936, 0.


0

Aby uzyskać dostęp do danych, musisz to zrobić:

foo = {
    "foo0": "bar0",
    "foo1": "bar1",
    "foo2": "bar2",
    "foo3": "bar3"
}
for bar in foo:
  print(bar)

Lub, aby uzyskać dostęp do wartości, którą po prostu wywołujesz z klucza: foo[bar]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.