Как напечатать ключ словаря?

213

Я хотел бы напечатать определенный ключ словаря Python:

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

Теперь я могу проверить, если mydic.has_key('key_name'), но я хотел бы напечатать название ключа 'key_name'. Конечно, я мог бы использовать mydic.items(), но я не хочу, чтобы все перечисленные ключи, просто один конкретный ключ. Например, я ожидал что-то вроде этого (в псевдокоде):

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

Есть ли name_the_key()способ напечатать имя ключа?


Изменить: ОК, большое спасибо, ребята, за ваши реакции! :) Я понимаю, что мой вопрос не очень хорошо сформулирован и тривиален. Я просто запутался, потому что я понял key_name и mydic['key_name']это две разные вещи, и я подумал, что было бы неправильно печатать key_nameконтекст словаря. Но на самом деле я могу просто использовать «key_name» для ссылки на ключ! :)

Вениамин
источник
19
Если вы знаете, какой именно ключ вы хотите, мм, вы уже знаете, что это за ключ.
Wooble

Ответы:

383

Словарь по определению имеет произвольное количество ключей. Там нет "ключ". У вас есть keys()метод, который дает вам питон listвсех ключей, и у вас есть iteritems()метод, который возвращает пары ключ-значение, поэтому

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

Версия Python 3:

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

Таким образом, у вас есть ручка для ключей, но они действительно имеют смысл только в том случае, если они связаны со значением. Я надеюсь, что понял ваш вопрос.

juanchopanza
источник
1
Хотя это отлично работает для меня в Python 2.7, какова альтернатива в Py3k? Я знаю, .iteritems()что больше не поддерживается ...
Пиперчестер
6
@PolyShell - альтернатива в Python 3, если это то, что вы имеете в виду под Py3k (я уже давно не в Python) .items(). Я добавил пример.
Juanchopanza
1
@Bibhas Они оба работают, но семантика различна. items()возвращает список в Python 2.x.
Juanchopanza
73

Дополнительно вы можете использовать ....

print(dictionary.items()) #prints keys and values
print(dictionary.keys()) #prints keys
print(dictionary.values()) #prints values
каменщик
источник
Спасибо! Именно это я и искал :)
Масуд Малеки
34

Хм, я думаю, что вы, возможно, захотите сделать, это напечатать все ключи в словаре и их соответствующие значения?

Если это так, вы хотите следующее:

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

Убедитесь, что вы также используете + вместо '. Я думаю, что запятая поместит каждый из этих элементов в отдельную строку, а в качестве плюса - в одну строку.

Доминик Сантос
источник
2
запятая будет оставлять их на одной строке, но вставлять пробелы между "is"и keyт. д. Если вы используете, +вам нужно добавить дополнительный отступ в строках. Кроме того, ключ и значение не обязательно являются строкой, в этом случае запятая будет использовать str (ключ) и str (значение), тогда как +вызовет ошибку
Джон Ла Рой
1
Это единственный ответ, который, как я знаю, неправильный, поскольку ОП сказал: «Я не хочу, чтобы все ключи были в списке».
Нед Бэтчелдер
Почему-то я думал иначе для запятой; Вы правы в этом. Я также перечитал вопрос, кажется, мы оба написали «все» жирным шрифтом - мой плохой.
Доминик Сантос
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

Примечание: в Python 3 dic.iteritems () был переименован в dic.items ()

ademar111190
источник
25

Имя ключа 'key_name' является ключом_имя, следовательно, print 'key_name'или любой другой переменной, которую вы представляете.

Зенна
источник
10

В Python 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

Поскольку мы все пытаемся угадать, что может означать «напечатать имя ключа», я попытаюсь это сделать. Возможно, вам нужна функция, которая берет значение из словаря и находит соответствующий ключ? Обратный поиск?

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

Обратите внимание , что многие клавиши могут иметь такое же значение, так что эта функция возвращает некоторый ключ , имеющий значение, возможно , не тот , который вы задумывали.

Если вам нужно делать это часто, имеет смысл создать обратный словарь:

d_rev = dict(v,k for k,v in d.iteritems())
Нед Бэтчелдер
источник
Обратите внимание (как указано выше) на то, что в Python 3 итериитемы стали просто «элементами».
Майк
Внимание: если вы измените iteritemsна items, то, как первоначально показано, этот ответ вернет только первый ключ - если есть несколько совпадений. Чтобы решить эту проблему, создайте пустой список перед for loop( values_list = []), затем добавьте ключи к этому списку ( values_list.append(k)) в ifцикле. Наконец, переместите оператор return ( return values_list) за пределы forцикла.
Виктория Стюарт
4

Или вы можете сделать это так:

for key in my_dict:
     print key, my_dict[key]
Евгений Солдатов
источник
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

Изменить: Обновлено для F-строк Python 3 ...

Брайан Брюггеман
источник
3

Не забудьте сделать

dictionary.keys()
# rather than
dictionary.keys
катодно-лучевая трубка
источник
2

Что не так с использованием 'key_name'вместо, даже если это переменная?

Ry-
источник
2
import pprint
pprint.pprint(mydic.keys())
Мэтт Джойнер
источник
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

Вероятно, самый быстрый способ получить только имя ключа:

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

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

Результат:

key_name

Преобразует dictionaryв a listзатем перечисляет первый элемент, который является целым, а dictзатем перечисляет первое значение этого элемента, которое:key_name

Fekete Sumér
источник
Зачем получать значение тоже?
Мартин Питерс
1

Я посмотрел на этот вопрос, потому что я хотел знать, как извлечь имя «ключа», если в моем словаре была только одна запись. В моем случае ключ был неизвестен мне и мог быть любым количеством вещей. Вот что я придумал:

dict1 = {'random_word': [1,2,3]}
key_name = str([key for key in dict1]).strip("'[]'")        
print(key_name)  # equal to 'random_word', type: string.
PeaWagon
источник
0

Попробуй это:

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
FDB
источник
0
key_name = '...'
print "the key name is %s and its value is %s"%(key_name, mydic[key_name])
Дон
источник
0

Если вы хотите получить ключ одного значения, поможет следующее:

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

Питоническим способом:

c = next((x for x, y in mydic.items() if y.lower() == b.lower()), \
     "Enter a valid 'Value'")
print(c)
Jeril
источник
0

Я добавляю этот ответ как один из других ответов здесь ( https://stackoverflow.com/a/5905752/1904943 ), датированный (Python 2; iteritems), и представленный код - если обновляется для Python 3 согласно предложенному Обходной путь в комментарии к этому ответу - молча не удается вернуть все соответствующие данные.


Задний план

У меня есть некоторые метаболические данные, представленные в графе (узлы, ребра, ...). В словарном представлении этих данных ключи имеют форму (604, 1037, 0)(представляющую исходный и целевой узлы и тип ребра) со значениями формы 5.3.1.9(представляющими коды фермента EC).

Найти ключи для заданных значений

Следующий код правильно находит мои ключи с заданными значениями:

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)]

тогда как этот код возвращает только первый (возможно, из нескольких совпадающих) ключей:

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)

Последний код, наивно обновленный заменой iteritemsна items, не возвращается (604, 3936, 0), (1037, 3936, 0.

Виктория Стюарт
источник
0

Для доступа к данным вам необходимо сделать это:

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

Или, чтобы получить доступ к значению, вы просто вызываете его с ключа: foo[bar]

mmendescortes
источник