Làm thế nào để in khóa từ điển?


213

Tôi muốn in một khóa từ điển Python cụ thể:

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

Bây giờ tôi có thể kiểm tra xem mydic.has_key('key_name'), nhưng những gì tôi muốn làm là in tên của khóa 'key_name'. Tất nhiên tôi có thể sử dụng mydic.items(), nhưng tôi không muốn tất cả các khóa được liệt kê, chỉ là một khóa cụ thể. Chẳng hạn, tôi mong đợi một cái gì đó như thế này (bằng mã giả):

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

name_the_key()phương pháp nào để in tên khóa không?


Chỉnh sửa: OK, cảm ơn rất nhiều người cho phản ứng của bạn! :) Tôi nhận ra câu hỏi của tôi không được xây dựng tốt và tầm thường. Tôi chỉ bối rối vì tôi nhận ra key_name và mydic['key_name']là hai thứ khác nhau và tôi nghĩ rằng sẽ không chính xác khi in key_namera khỏi ngữ cảnh từ điển. Nhưng thực sự tôi chỉ có thể sử dụng 'key_name' để chỉ khóa! :)


19
Nếu bạn biết khóa cụ thể bạn muốn là gì, umm, bạn đã biết khóa đó là gì.
Wooble

Câu trả lời:


381

Theo định nghĩa, một từ điển có số lượng khóa tùy ý. Không có "chìa khóa". Bạn có keys()phương thức, cung cấp cho bạn một con trăn listgồm tất cả các khóa và bạn có iteritems()phương thức trả về các cặp khóa-giá trị, vì vậy

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

Phiên bản Python 3:

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

Vì vậy, bạn có một tay cầm trên các phím, nhưng chúng chỉ thực sự có ý nghĩa nếu được kết hợp với một giá trị. Tôi hy vọng tôi đã hiểu câu hỏi của bạn.


1
Mặc dù điều này làm việc rất tốt đối với tôi trong Python 2.7, nhưng sự thay thế trong Py3k là gì? Tôi biết .iteritems()là không còn được hỗ trợ ...
piperchester

5
@PolyShell thay thế trong python 3, nếu đó là ý nghĩa của Py3k (tôi đã rời xa python một thời gian rồi) .items(). Tôi đã thêm một ví dụ.
juanchopanza

1
@Bibhas Cả hai đều hoạt động, nhưng ngữ nghĩa là khác nhau. items()trả về một danh sách trong python 2.x.
juanchopanza

72

Ngoài ra, bạn có thể sử dụng ....

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

Cảm ơn! Đây là những gì tôi đã tìm kiếm chính xác :)
Masoud Maleki

34

Hmm, tôi nghĩ rằng những gì bạn có thể muốn làm là in tất cả các khóa trong từ điển và các giá trị tương ứng của chúng?

Nếu vậy bạn muốn như sau:

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

Hãy chắc chắn rằng bạn cũng sử dụng + 'thay vì,'. Tôi nghĩ rằng dấu phẩy sẽ đặt từng mục đó trên một dòng riêng biệt, trong đó dấu cộng sẽ đặt chúng trên cùng một dòng.


2
dấu phẩy sẽ để chúng trên cùng một dòng, nhưng chèn khoảng trắng giữa "is"keyvv Nếu bạn sử dụng, +bạn cần đặt phần đệm thêm vào chuỗi. Ngoài ra khóa và giá trị không nhất thiết phải là chuỗi, trong trường hợp đó, dấu phẩy sẽ sử dụng str (key) và str (value) trong khi đó +sẽ gây ra lỗi
John La Rooy

1
Đây là câu trả lời tôi biết là không đúng, vì OP nói, "Tôi không muốn tất cả các khóa được liệt kê."
Ned Batchelder

Vì một số lý do, tôi nghĩ khác về dấu phẩy; bạn đúng về điều đó Tôi cũng đã đọc lại câu hỏi, có vẻ như cả hai chúng tôi đều in đậm 'tất cả' - cái xấu của tôi.
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

Lưu ý: Trong Python 3, dic.iteritems () đã được đổi tên thành dic.items ()


25

Tên của khóa 'key_name' là key_name, do đó print 'key_name'hoặc bất kỳ biến nào bạn có đại diện cho nó.


10

Trong 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

Vì tất cả chúng ta đều cố gắng đoán "in tên khóa" có nghĩa là gì, tôi sẽ đâm vào nó. Có lẽ bạn muốn một hàm lấy một giá trị từ từ điển và tìm khóa tương ứng? Tra cứu ngược?

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

Lưu ý rằng nhiều khóa có thể có cùng giá trị, vì vậy hàm này sẽ trả về một số khóa có giá trị, có thể không phải là khóa bạn dự định.

Nếu bạn cần làm điều này thường xuyên, sẽ có ý nghĩa khi xây dựng từ điển ngược:

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

Lưu ý (như trên) rằng iteritems chỉ đơn giản là 'vật phẩm' trong Python 3.
Mike

Thận trọng: nếu bạn thay đổi iteritemsthành items, thì như ban đầu, câu trả lời này sẽ chỉ trả về khóa đầu tiên - nếu có nhiều kết quả khớp. Để giải quyết điều này, hãy tạo một danh sách trống trước dấu for loop( values_list = []), sau đó nối các khóa vào danh sách này ( values_list.append(k)), trong ifvòng lặp. Cuối cùng, di chuyển câu lệnh return ( return values_list) bên ngoài forvòng lặp.
Victoria Stuart

4

Hoặc bạn có thể làm theo cách đó:

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

Chỉnh sửa: Đã cập nhật cho chuỗi f của python 3 ...


3

Hãy chắc chắn để làm

dictionary.keys()
# rather than
dictionary.keys

2

Có gì sai khi sử dụng 'key_name'thay thế, ngay cả khi nó là một biến?



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

Có lẽ cách nhanh nhất để chỉ lấy tên khóa:

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

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

Kết quả:

key_name

Chuyển đổi dictionarythành một listrồi nó liệt kê phần tử đầu tiên là toàn bộ dictsau đó nó liệt kê giá trị đầu tiên của phần tử đó là:key_name


Tại sao lấy lại giá trị quá mặc dù?
Martijn Pieters

1

Tôi đã tra cứu câu hỏi này, vì tôi muốn biết làm thế nào để lấy lại tên của "chìa khóa" nếu từ điển của tôi chỉ có một mục. Trong trường hợp của tôi, chìa khóa không được biết đến với tôi và có thể là bất kỳ số lượng nào. Đây là những gì tôi đã đưa ra:

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

Thử cái này:

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

Nếu bạn muốn lấy khóa của một giá trị, điều sau đây sẽ giúp:

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

Theo cách pythonic:

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

0

Tôi đang thêm câu trả lời này như một trong những câu trả lời khác tại đây ( https://stackoverflow.com/a/5905752/1904943 ) là ngày (Python 2; iteritems) và mã được trình bày - nếu được cập nhật cho Python 3 theo đề xuất cách giải quyết trong một bình luận cho câu trả lời đó - âm thầm không trả lại tất cả dữ liệu liên quan.


Lý lịch

Tôi có một số dữ liệu trao đổi chất, được biểu thị trong biểu đồ (nút, cạnh, ...). Trong biểu diễn từ điển của những dữ liệu đó, các khóa có dạng (604, 1037, 0)(đại diện cho các nút nguồn và nút đích và loại cạnh), với các giá trị của biểu mẫu 5.3.1.9(đại diện cho mã enzyme EC).

Tìm khóa cho các giá trị đã cho

Đoạn mã sau tìm đúng các khóa của tôi, các giá trị đã cho:

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

trong khi mã này chỉ trả về các khóa đầu tiên (có thể là một số khớp):

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)

Các mã sau, ngây thơ được cập nhật thay thế iteritemsvới items, thất bại trong việc trở lại (604, 3936, 0), (1037, 3936, 0.


0

Để truy cập dữ liệu, bạn sẽ cần phải làm điều này:

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

Hoặc, để truy cập giá trị bạn chỉ cần gọi nó từ khóa: foo[bar]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.