วิธีพิมพ์คีย์ของพจนานุกรม


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

คำตอบ:


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 ทางเลือกในหลาม 3, ถ้านั่นคือสิ่งที่คุณหมายถึง Py3k (ผมเคยห่างจากงูหลามสำหรับขณะนี้) .items()มัน ฉันเพิ่มตัวอย่าง
juanchopanza

1
@Bibhas พวกเขาทั้งคู่ทำงาน แต่ความหมายต่างกัน items()ส่งคืนรายการใน python 2.x
juanchopanza


34

อืมฉันคิดว่าสิ่งที่คุณอาจต้องการทำคือพิมพ์คีย์ทั้งหมดในพจนานุกรมและค่าที่เกี่ยวข้อง

ถ้าเป็นเช่นนั้นคุณต้องการต่อไปนี้:

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

ตรวจสอบให้แน่ใจว่าคุณใช้ + แทนที่จะเป็นเช่นกัน เครื่องหมายจุลภาคจะวางแต่ละรายการเหล่านั้นในบรรทัดแยกฉันคิดว่าที่เป็นบวกจะวางไว้ในบรรทัดเดียวกัน


2
เครื่องหมายจุลภาคจะปล่อยไว้ในบรรทัดเดียวกัน แต่ใส่ช่องว่างระหว่าง"is"และkeyอื่น ๆ หากคุณใช้+คุณจำเป็นต้องใส่ช่องว่างพิเศษในสตริง คีย์และค่าไม่จำเป็นต้องเป็นสตริงเช่นกันในกรณีนี้เครื่องหมายจุลภาคจะใช้ str (key) และ str (value) โดยที่+จะทำให้เกิดข้อผิดพลาด
John La Rooy

1
นี่คือคำตอบเดียวที่ฉันรู้ว่าไม่ถูกต้องเนื่องจาก OP กล่าวว่า "ฉันไม่ต้องการคีย์ทั้งหมดในรายการ"
Ned Batchelder

ด้วยเหตุผลบางอย่างฉันคิดอย่างอื่นสำหรับเครื่องหมายจุลภาค; คุณพูดถูก ฉันได้อ่านคำถามอีกครั้งดูเหมือนว่าเรามี 'ตัวหนา' ทั้งหมดเป็นตัวหนา - ไม่ดี
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

หมายเหตุ: ใน Python 3 dic.iteritems () ถูกเปลี่ยนชื่อเป็น dic.items ()


25

ชื่อของคีย์ 'key_name' คือ 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
Mike

ข้อควรระวัง: ถ้าคุณเปลี่ยนiteritemsไปitemsแล้วแสดงให้เห็นว่าเดิมคำตอบนี้จะคืนกุญแจดอกแรก - ถ้ามีหลายแมตช์ หากต้องการแก้ปัญหานี้ให้สร้างรายการว่างไว้ข้างหน้าfor loop( values_list = []) จากนั้นต่อท้ายคีย์ไปยังรายการนี้ ( values_list.append(k)) ในifลูป ขั้นตอนสุดท้ายให้ย้ายคำสั่ง return ( return values_list) ออกนอกforลูป
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

แก้ไข: อัปเดตสำหรับ f-strings ของ python 3 ...



2

เกิดอะไรขึ้นกับการใช้งาน'key_name'แทนแม้ว่าจะเป็นตัวแปร




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

หากคุณต้องการรับค่าคีย์เดียวค่าต่อไปนี้จะช่วย:

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

ในทาง pythonic:

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(แสดงรหัสรหัสเอนไซม์ 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]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.