Як надрукувати ключ словника?


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()метод для друку імені ключа?


Редагувати: Добре, дякую хлопцям за вашу реакцію! :) Я усвідомлюю, що моє питання недостатньо сформульоване та тривіальне. Я просто заплутався, тому що я зрозумів, що ключове ім'я mydic['key_name']є двома різними речами, і я вважав, що це буде неправильним для друку key_nameз контексту словника. Але насправді я можу просто використовувати "ім'я_кодаля" для позначення ключа! :)


19
Якщо ви знаєте, що конкретний ключ, який ви хочете, гмм, ви вже знаєте, що таке ключ.
Wooble

Відповіді:


382

Словник за визначенням має довільну кількість клавіш. Немає "ключа". У вас є keys()метод, який дає вам пітон listусіх ключів, і у вас є iteritems()метод, який повертає пари ключ-значення,

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

Версія Python 3:

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

Таким чином, у вас є ручка на клавішах, але вони справді означають сенс лише у поєднанні зі значенням. Я сподіваюся, що я зрозумів ваше запитання.


1
Хоча це для мене прекрасно працювало в Python 2.7, яка альтернатива в Py3k? Я знаю .iteritems(), більше не підтримується ...
piperchester

5
@PolyShell альтернатива в python 3, якщо це саме ви маєте на увазі під Py3k (я вже деякий час не був у python) .items(). Я додав приклад.
juanchopanza

1
@Bibhas Вони обидва працюють, але семантика різна. items()повертає список у python 2.x.
juanchopanza

72

Додатково ви можете використовувати ....

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


25

Ім'я ключа 'ім'я_коректу' - це ім'я_коректу, отже, 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())

Зауважте (як вище), що iteritems стали просто "предметами" в Python 3.
Майк,

Застереження: якщо ви перейдете iteritemsдо цього items, то, як показано спочатку, ця відповідь поверне лише перший ключ - якщо є кілька збігів. Щоб вирішити це, створіть порожній список перед for loop( values_list = []), потім додайте ключі до цього списку ( values_list.append(k)) у ifциклі. Останнє, перемістіть оператор return ( return values_list) за межі forциклу.
Вікторія Стюарт


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', навіть якщо це змінна?



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


Навіщо також отримувати значення?
Martijn Pieters

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.

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

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)

0

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


Фон

У мене є деякі метаболічні дані, представлені у графіку (вузли, краї, ...). У словниковому поданні цих даних ключі мають форму (604, 1037, 0)(представляють вихідні та цільові вузли та тип ребра) зі значеннями форми 5.3.1.9(представляють коди ферментів ЄС).

Знайдіть ключі для заданих значень

Наступний код правильно знаходить мої ключі, задані значення:

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]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.