รับค่าคีย์ในพจนานุกรม


632

ฉันสร้างฟังก์ชั่นซึ่งจะค้นหาอายุใน a Dictionaryและแสดงชื่อที่ตรงกัน:

dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
for age in dictionary.values():
    if age == search_age:
        name = dictionary[age]
        print name

ฉันรู้วิธีการเปรียบเทียบและหาอายุฉันแค่ไม่รู้วิธีแสดงชื่อของบุคคล นอกจากนี้ฉันได้รับKeyErrorเนื่องจากบรรทัด 5 ฉันรู้ว่ามันไม่ถูกต้อง แต่ฉันไม่สามารถหาวิธีที่จะทำให้การค้นหาย้อนหลัง



คุณจะหาคำตามคำจำกัดความในพจนานุกรมหรือไม่ NOPE
Jossie Calderon

คำตอบ:


563

ไม่มีเลย dictไม่ได้ตั้งใจจะใช้วิธีนี้

dictionary = {'george': 16, 'amber': 19}
search_age = input("Provide age")
for name, age in dictionary.items():  # for name, age in dictionary.iteritems():  (for Python 2.x)
    if age == search_age:
        print(name)

137
ในPython 3.x list.items()แทนlist.iteritems()ควรจะใช้
Yuriy Petrovskiy

63
ฉันไม่เห็นด้วย ... คำตอบของ agf ด้านล่างมีความสร้างสรรค์มากกว่า กรณีการใช้งานที่เหมาะสมอย่างสมบูรณ์ไม่ใช่ "ไม่ได้ตั้งใจ" (ความเข้าใจในรายการนั้นเหมาะสมกับกรณีใช้งานอยู่แล้ว) dictสามารถสำหรับหลายสิ่งในเวลาที่แตกต่างกัน คีย์และค่ามีความหมายที่ชัดเจนแน่นอน แต่" dictรายการที่มีค่าที่กำหนด"เป็นคำขอที่สมเหตุสมผลอย่างสมบูรณ์แบบ คำแนะนำในการใช้รายการคู่จะทิ้งบริบทที่รายการหนึ่งคือ ' คำจำกัดความ ' จากอีกรายการหนึ่งเช่นในรายการพารามิเตอร์ ...
Louis Maddox

1
ฉันไม่เห็นด้วยกับคำตอบนี้ ความจริงที่ว่ามันเป็นไปได้ดังแสดงในคำตอบโดย Stionio Elson ไม่ได้หมายความว่ามันไม่ได้ตั้งใจที่จะใช้เช่นนี้ ไม่เป็นประโยชน์เลย
Tropicalrambler

คุณจะพบคำในพจนานุกรมตามคำจำกัดความหรือไม่ NOPE @Tropicrambler
Jossie Calderon

แม้ว่าคุณจะมีจุดที่การใช้คำแบบมาตรฐานสำหรับพจนานุกรมคำคือการค้นหาคำจำกัดความของคำด้วย word = key และ definition = value ภาษาการเขียนโปรแกรมของวันนี้ช่วยให้คุณสามารถค้นหาตามค่าหากจำเป็น หากคุณกำลังทำงานกับคีย์: วัตถุคู่ค่า (เรียกว่าพจนานุกรม tuple ชื่ออะไรก็ตามสำหรับภาษาใด ๆ ) ในไพ ธ อนคุณสามารถจัดทำดัชนีตามค่าของโครงสร้างเพื่อค้นหาคีย์ที่เกี่ยวข้องได้
Tropicalrambler

599
mydict = {'george': 16, 'amber': 19}
print mydict.keys()[mydict.values().index(16)]  # Prints george

หรือใน Python 3.x:

mydict = {'george': 16, 'amber': 19}
print(list(mydict.keys())[list(mydict.values()).index(16)])  # Prints george

โดยพื้นฐานแล้วมันจะแยกค่าของพจนานุกรมในรายการค้นหาตำแหน่งของค่าที่คุณมีและรับกุญแจที่ตำแหน่งนั้น

เพิ่มเติมเกี่ยวกับkeys()และ.values()ใน Python 3: ฉันจะรับรายการค่าจาก dict ได้อย่างไร


23
ดูดี แต่มันใช้งานได้เสมอหรือไม่ ฉันหมายความว่าทำlist.keys()และlist.values()ฟังก์ชั่นสร้างรายการในลำดับเดียวกันหรือไม่
iskorum

17
ใช่พวกเขารับประกันว่าจะสอดคล้อง นอกจากนี้คำสั่งซื้อจะรับประกันว่าจะไม่เปลี่ยนแปลงตลอดการทำซ้ำตราบใดที่ไม่มีการแก้ไขพจนานุกรม
Veedrac

9
นี่ดูเหมือนจะเป็นทางออกที่ดี แต่ดัชนีให้ค่าเดียวเท่านั้นดังนั้นถ้าคุณมีค่าเท่ากันหลายค่ามันควรคืนค่าหลาย ๆ คีย์ใช่มั้ย
เจมส์สะปำ

12
@ArtOfWarfare docs.python.org/3/library/stdtypes.html#dict-views "ถ้าคีย์ค่าและมุมมองรายการถูกวนซ้ำโดยไม่มีการแก้ไขการแทรกแซงพจนานุกรมลำดับของรายการจะสอดคล้องกันโดยตรง"
Veedrac

5
@sinekonata: มันยังคงทำการวนรอบที่มีราคาแพงภายใต้ประทุน การวนซ้ำถูกซ่อนอยู่ภายในindexเมธอด
user2357112 รองรับ Monica

252

หากคุณต้องการทั้งชื่อและอายุคุณควรจะใช้.items()ซึ่งทำให้คุณได้รับสิ่งสำคัญ(key, value):

for name, age in mydict.items():
    if age == search_age:
        print name

คุณสามารถแกะ tuple ออกเป็นสองตัวแปรแยกกันได้ใน forลูปจากนั้นจับคู่อายุ

คุณควรพิจารณาการกลับรายการพจนานุกรมหากโดยทั่วไปคุณจะต้องค้นหาตามอายุและไม่มีคนสองคนที่มีอายุเท่ากัน:

{16: 'george', 19: 'amber'}

เพื่อให้คุณสามารถค้นหาชื่อสำหรับอายุโดยเพียงแค่ทำ

mydict[search_age]

ฉันโทรมาแล้ว mydictแทนlistเพราะlistเป็นชื่อของชนิดในตัวและคุณไม่ควรใช้ชื่อนั้นเพื่อสิ่งอื่น

คุณยังสามารถรับรายชื่อบุคคลทั้งหมดที่มีอายุที่กำหนดในหนึ่งบรรทัด:

[name for name, age in mydict.items() if age == search_age]

หรือถ้ามีเพียงคนเดียวในแต่ละช่วงอายุ:

next((name for name, age in mydict.items() if age == search_age), None)

ซึ่งจะทำให้คุณ Noneถ้าไม่มีใครที่อายุ

ท้ายที่สุดถ้าความdictยาวและคุณอยู่ใน Python 2 คุณควรพิจารณาใช้.iteritems()แทน.items()อย่างที่ Cat Plus Plus ทำในคำตอบของเขาเนื่องจากไม่จำเป็นต้องทำสำเนารายการ


9
ถูกต้อง แต่ถ้าคุณจะทำการค้นหาเชิงเส้นคุณอาจแทนที่dictด้วยรายการคู่
Fred Foo

9
นอกจากการกระทำตามปกติของคุณคือค้นหาวัยโดยใช้ชื่อในกรณีที่dictเหมาะสม
agf

2
ดูเหมือนเป็นเรื่องแปลกที่จะสมมติว่ามีเพียงคนเดียวเท่านั้นที่มีอายุแต่ละคนในขณะที่ในอีกทางหนึ่งมันเป็นเหตุผลที่สมบูรณ์สำหรับแต่ละบุคคลที่จะมีอายุเดียว
Dannid

@Danid ใช่ แต่ปัญหาสามารถทำให้เป็นเรื่องปกติได้อย่างง่ายดาย ตัวอย่างเช่นคุณอาจมีตารางค้นหาพร้อมกับคีย์ที่ไม่ซ้ำกันและค่าที่ไม่ซ้ำกันที่เกี่ยวข้อง จากนั้นคุณสามารถค้นหาสิ่งที่สมมาตรvalue --> keyหรือkey --> value
pfabri

67

ฉันคิดว่ามันน่าสนใจที่จะชี้ให้เห็นว่าวิธีใดเร็วที่สุดและในสถานการณ์ใด:

นี่คือการทดสอบบางอย่างที่ฉันใช้ (ใน MacBook Pro 2012)

>>> def method1(list,search_age):
...     for name,age in list.iteritems():
...             if age == search_age:
...                     return name
... 
>>> def method2(list,search_age):
...     return [name for name,age in list.iteritems() if age == search_age]
... 
>>> def method3(list,search_age):
...     return list.keys()[list.values().index(search_age)]

ผลลัพธ์จากprofile.run()ในแต่ละวิธี 100,000 ครั้ง:

วิธีที่ 1:

>>> profile.run("for i in range(0,100000): method1(list,16)")
     200004 function calls in 1.173 seconds

วิธีที่ 2:

>>> profile.run("for i in range(0,100000): method2(list,16)")
     200004 function calls in 1.222 seconds

วิธีที่ 3:

>>> profile.run("for i in range(0,100000): method3(list,16)")
     400004 function calls in 2.125 seconds

ดังนั้นนี่แสดงให้เห็นว่าสำหรับ dict ขนาดเล็กวิธีที่ 1 นั้นเร็วที่สุด นี่เป็นไปได้มากที่สุดเพราะมันจะส่งคืนการแข่งขันครั้งแรกเมื่อเทียบกับการแข่งขันทั้งหมดเช่นวิธีที่ 2 (ดูหมายเหตุด้านล่าง)


ที่น่าสนใจคือทำการทดสอบแบบเดียวกันกับ dict ที่ฉันมีด้วย 2,700 รายการฉันได้รับผลลัพธ์ที่แตกต่างกันมาก (คราวนี้เรียกใช้ 10,000 ครั้ง):

วิธีที่ 1:

>>> profile.run("for i in range(0,10000): method1(UIC_CRS,'7088380')")
     20004 function calls in 2.928 seconds

วิธีที่ 2:

>>> profile.run("for i in range(0,10000): method2(UIC_CRS,'7088380')")
     20004 function calls in 3.872 seconds

วิธีที่ 3:

>>> profile.run("for i in range(0,10000): method3(UIC_CRS,'7088380')")
     40004 function calls in 1.176 seconds

ดังนั้นนี่คือวิธีที่ 3 เป็นมากได้เร็วขึ้น เพียงไปเพื่อแสดงขนาดของ dict ของคุณจะมีผลต่อวิธีการที่คุณเลือก

หมายเหตุ: วิธีที่ 2 ส่งคืนรายการของชื่อทั้งหมดในขณะที่วิธีที่ 1 และ 3 ส่งคืนเฉพาะการจับคู่ครั้งแรก ฉันไม่ได้พิจารณาการใช้งานหน่วยความจำ ฉันไม่แน่ใจว่าวิธีที่ 3 สร้าง 2 รายการพิเศษ (คีย์ () และค่า ()) และเก็บไว้ในหน่วยความจำ


6
เพียงแค่อัปเดต: ดูเหมือนว่า dict.values ​​() และ dict.keys () ทั้งสองรายการส่งคืนที่อ้างอิงวัตถุจาก dict ดั้งเดิมดังนั้นวิธีที่ 3 จึงเป็นหน่วยที่ใช้หน่วยความจำน้อยที่สุด (มันสร้างวัตถุรายการบางสองรายการเท่านั้น ซึ่งห่อเนื้อหาของ dicts ในขณะที่คนอื่นสร้างรายการตัววนซ้ำ
Patrick

ฉันแค่ต้องการสร้างมาตรฐานตัวเองเลื่อนลงแบมคุณมีมัน ขอบคุณ! ในทางเทคนิคเมื่อคุณชี้ให้เห็นแล้วว่าวิธีที่ 2 ไม่ได้ทำอย่างเดียวกันกับ 1 และ 3 เพราะมันจะส่งคืนการแข่งขันทั้งหมด จะดีที่ได้เห็นผลลัพธ์สำหรับเช่นกลับไปต่อไป ([.. ])
BluBb_mADe

สิ่งสำคัญที่ควรทราบอีกประการคือรุ่น Python ฉันรู้ว่าบางรุ่นมีวิธีการใช้งานที่มีประสิทธิภาพมากกว่าคนอื่น ๆ
ArtOfWarfare

@ แพทริก: วิธีการทั้งหมดใช้การอ้างอิงโดยตรงไปยังค่าและคีย์ไม่มีข้อได้เปรียบของหน่วยความจำใด ๆ ยกเว้นใน Python 3 และ.keys()` .values()คืนการดูพจนานุกรมซึ่งมีน้ำหนักเบา
Martijn Pieters

53

รุ่นหนึ่งบรรทัด: (ฉันเป็นพจนานุกรมเก่า p เป็นพจนานุกรมที่กลับรายการ)

คำอธิบาย: i.keys()และi.values()ส่งคืนสองรายการด้วยคีย์และค่าของพจนานุกรมตามลำดับ ฟังก์ชั่นซิปมีความสามารถในการผูกรายการเพื่อสร้างพจนานุกรม

p = dict(zip(i.values(),i.keys()))

คำเตือน:สิ่งนี้จะทำงานได้ก็ต่อเมื่อค่านั้นถูกแฮชและไม่ซ้ำกัน


ใช่มันจะใช้งานได้: stackoverflow.com/questions/835092/…
The Unfun Cat

17
... และเมื่อไม่มีค่าซ้ำกัน
ely

3
สวย. Wrt ความคิดเห็นด้านบนแน่นอนว่าใช้งานได้เฉพาะเมื่อไม่มีค่าซ้ำกัน แต่จากนั้นคำถามที่เริ่มต้นเธรดนี้จะทำให้สมมติฐานว่าเรามีฟังก์ชั่นหนึ่งต่อหนึ่ง การตอบสนองโดยไกล
John Strong

1
การขยายตัวของค่าที่ลบได้: หากค่าของคุณคือรายการ / ชุดให้แปลงเป็น tuple เพื่อให้มันใช้งานได้
muon

28
a = {'a':1,'b':2,'c':3}
{v:k for k, v in a.items()}[1]

หรือดีกว่า

{k:v for k, v in a.items() if v == 1}

5
จะเกิดอะไรขึ้นถ้ามีคีย์อื่นที่มีค่าเท่ากัน? อาจเป็นวิธี pythonic แต่ไม่ใช่ความคิดที่ดี
7H3 IN5ID3R

จุดดีฉันได้เพิ่มวิธีแก้ปัญหาที่ทำงานร่วมกับค่าที่ไม่ซ้ำกัน
Jelen

26
key = next((k for k in my_dict if my_dict[k] == val), None)

ฉันสามารถมี 'อื่น' ในบรรทัดเดียวกันนี้ได้ไหม สำหรับกรณีที่เมื่อค่าของฉันไม่ได้อยู่ในค่า dict
Srishti Gupta

lKey = [k for k, v in lDictionary.iteritems() if v == lValue][0] or 'else-key'
faham

14

ลองใช้หนึ่งซับเพื่อย้อนกลับพจนานุกรม:

reversed_dictionary = dict(map(reversed, dictionary.items()))

1
สิ่งนี้ใช้งานได้ดีเยี่ยมสำหรับโปรแกรมเข้ารหัสและถอดรหัสของฉันขอบคุณ!
คริสเตียน R


@pfabri ???????
johnaphun

13

ฉันพบคำตอบนี้มีประสิทธิภาพมาก แต่ไม่ง่ายสำหรับฉันที่จะอ่าน

เพื่อให้ชัดเจนยิ่งขึ้นคุณสามารถสลับคีย์และค่าของพจนานุกรมได้ นี่คือทำให้ค่าคีย์และคีย์ค่าเท่าที่เห็นนี่

mydict = {'george':16,'amber':19}
res = dict((v,k) for k,v in mydict.iteritems())
print(res[16]) # Prints george

หรือ

mydict = {'george':16,'amber':19}
dict((v,k) for k,v in mydict.iteritems())[16]

ซึ่งเป็นหลักเดียวกันกับที่คำตอบอื่น ๆนี้


12

หากคุณต้องการค้นหาคีย์ด้วยค่าคุณสามารถใช้ความเข้าใจในพจนานุกรมเพื่อสร้างพจนานุกรมการค้นหาจากนั้นใช้คีย์นั้นเพื่อค้นหาคีย์จากค่า

lookup = {value: key for key, value in self.data}
lookup[value]

11

คุณจะได้รับที่สำคัญโดยใช้dict.keys(), dict.values()และlist.index()วิธีการดูตัวอย่างโค้ดด้านล่าง:

names_dict = {'george':16,'amber':19}
search_age = int(raw_input("Provide age"))
key = names_dict.keys()[names_dict.values().index(search_age)]

2
คุณไม่ได้ใช้search_agevar ที่กำหนดไว้ในบรรทัดถัดไป ... คุณอาจจะแทนที่valueด้วยsearch_age?
Andersson

2
ฉันได้รับข้อผิดพลาดนี้: วัตถุ 'dict_values' ไม่มีแอตทริบิวต์ 'ดัชนี'
Blue_Elephant

@Blue_Elephant คุณกรุณาให้ข้อมูลรหัสที่คุณมีข้อผิดพลาดและรุ่นหลาม (เช่นการพิมพ์type(dict_values)จะมีประโยชน์)
Andriy Ivaneyko

9

นี่คือปัญหาของฉัน :) ฉันเพิ่งเริ่มเรียน Python ดังนั้นฉันจึงเรียกสิ่งนี้ว่า:

โซลูชัน "ความเข้าใจสำหรับผู้เริ่มต้น"

#Code without comments.

list1 = {'george':16,'amber':19, 'Garry':19}
search_age = raw_input("Provide age: ")
print
search_age = int(search_age)

listByAge = {}

for name, age in list1.items():
    if age == search_age:
        age = str(age)
        results = name + " " +age
        print results

        age2 = int(age)
        listByAge[name] = listByAge.get(name,0)+age2

print
print listByAge

.

#Code with comments.
#I've added another name with the same age to the list.
list1 = {'george':16,'amber':19, 'Garry':19}
#Original code.
search_age = raw_input("Provide age: ")
print
#Because raw_input gives a string, we need to convert it to int,
#so we can search the dictionary list with it.
search_age = int(search_age)

#Here we define another empty dictionary, to store the results in a more 
#permanent way.
listByAge = {}

#We use double variable iteration, so we get both the name and age 
#on each run of the loop.
for name, age in list1.items():
    #Here we check if the User Defined age = the age parameter 
    #for this run of the loop.
    if age == search_age:
        #Here we convert Age back to string, because we will concatenate it 
        #with the person's name. 
        age = str(age)
        #Here we concatenate.
        results = name + " " +age
        #If you want just the names and ages displayed you can delete
        #the code after "print results". If you want them stored, don't...
        print results

        #Here we create a second variable that uses the value of
        #the age for the current person in the list.
        #For example if "Anna" is "10", age2 = 10,
        #integer value which we can use in addition.
        age2 = int(age)
        #Here we use the method that checks or creates values in dictionaries.
        #We create a new entry for each name that matches the User Defined Age
        #with default value of 0, and then we add the value from age2.
        listByAge[name] = listByAge.get(name,0)+age2

#Here we print the new dictionary with the users with User Defined Age.
print
print listByAge

.

#Results
Running: *\test.py (Thu Jun 06 05:10:02 2013)

Provide age: 19

amber 19
Garry 19

{'amber': 19, 'Garry': 19}

Execution Successful!

9
get_key = lambda v, d: next(k for k in d if d[k] is v)

Nice หนึ่งซับ แต่isควรจะใช้สำหรับการทดสอบความเท่าเทียมกันของ singletons ( None, True, Falseฯลฯ ) ความจริงที่ว่า CPython reuses ตัวอักษรของสตริง (และดังนั้นจึงa = 'foobar'; a is 'foobar'เป็นTrue) เป็นรายละเอียดการดำเนินงานและไม่ควรที่จะเป็นที่พึ่ง
piit79

1
และอีกหนึ่งความคิดเห็น: get_keyจะโยนStopIterationหากไม่มีค่าในพจนานุกรม - จะดีกว่าถ้าใช้ค่าnext(..., None)ที่จะส่งคืนNoneหากไม่พบค่า
piit79

การปรับเปลี่ยนเล็กน้อยจะใช้งานได้หากพจนานุกรมไม่ได้มีองค์ประกอบเดียว แต่ชุด:get_first_key = lambda v, d: next((k for k in d if (v in d[k] is not None)), None)
ซูเปอร์โนวา

7

พิจารณาใช้หมีแพนด้า ตามที่ระบุไว้ใน "Python สำหรับการวิเคราะห์ข้อมูล" ของ William McKinney

อีกวิธีหนึ่งในการคิดเกี่ยวกับซีรี่ส์คือความยาวคงที่ซึ่งมีการเรียงตามคำสั่งเนื่องจากเป็นการแม็พค่าดัชนีกับค่าข้อมูล มันสามารถใช้ในหลายบริบทที่คุณอาจใช้ Dict

import pandas as pd
list = {'george':16,'amber':19}
lookup_list = pd.Series(list)

ในการค้นหาซีรี่ส์ของคุณให้ทำดังต่อไปนี้:

lookup_list[lookup_list.values == 19]

ซึ่งให้ผลผลิต:

Out[1]: 
amber    19
dtype: int64

หากคุณต้องการทำสิ่งใดกับผลลัพธ์ที่เปลี่ยนคำตอบลงในรายการอาจเป็นประโยชน์:

answer = lookup_list[lookup_list.values == 19].index
answer = pd.Index.tolist(answer)

เขาเป็นผู้สร้างนุ่น แม้ว่าเขาจะรู้จักกันในนาม Wes มากกว่า
Axel

6

ที่นี่ restore_key ใช้พจนานุกรมและค่าที่จะค้นหาในพจนานุกรม จากนั้นเราจะวนซ้ำคีย์ในพจนานุกรมและทำการเปรียบเทียบกับค่าและส่งคืนคีย์นั้น

def recover_key(dicty,value):
    for a_key in dicty.keys():
        if (dicty[a_key] == value):
            return a_key


4
for name in mydict:
    if mydict[name] == search_age:
        print(name) 
        #or do something else with it. 
        #if in a function append to a temporary list, 
        #then after the loop return the list

1
การใช้ for for loop และ append นั้นช้ากว่า list comprehension มากและใช้เวลานานกว่า
alexpinho98

3

มันตอบ แต่มันสามารถทำได้ด้วยการใช้ 'map / ลด' แฟนซีเช่น:

def find_key(value, dictionary):
    return reduce(lambda x, y: x if x is not None else y,
                  map(lambda x: x[0] if x[1] == value else None, 
                      dictionary.iteritems()))

3

Cat Plus Plus กล่าวว่านี่ไม่ใช่วิธีการใช้งานพจนานุกรม นี่คือเหตุผล:

ความหมายของพจนานุกรมนั้นคล้ายคลึงกับการทำแผนที่ในคณิตศาสตร์ ในกรณีนี้ dict คือการแม็พ K (ชุดของคีย์) ไปยัง V (ค่า) - แต่ไม่ใช่ในทางกลับกัน หากคุณยกเลิกการอ้างอิง dict คุณคาดหวังว่าจะได้รับหนึ่งค่าที่ส่งคืน แต่มันถูกกฎหมายอย่างสมบูรณ์แบบสำหรับปุ่มที่แตกต่างในการแมปไปยังค่าเดียวกันเช่น:

d = { k1 : v1, k2 : v2, k3 : v1}

เมื่อคุณค้นหาคีย์ด้วยค่าที่สอดคล้องกันคุณจะต้องพลิกพจนานุกรมเป็นหลัก แต่การทำแผนที่ไม่จำเป็นต้องย้อนกลับ! ในตัวอย่างนี้การขอคีย์ที่เกี่ยวข้องกับ v1 สามารถให้ผลลัพธ์ k1 หรือ k3 คุณควรกลับมาทั้งคู่ไหม พบเพียงคนแรก? นั่นเป็นเหตุผลที่ indexof () ไม่ได้กำหนดไว้สำหรับพจนานุกรม

ถ้าคุณรู้ข้อมูลของคุณคุณสามารถทำได้ แต่ API ไม่สามารถสรุปได้ว่าพจนานุกรมที่กำหนดเองกลับด้านได้ดังนั้นจึงไม่มีการดำเนินการ


3

นี่คือสิ่งที่ฉันทำ สิ่งนี้ดีสำหรับการแสดงผลลัพธ์หลายรายการในกรณีที่คุณต้องการ ดังนั้นฉันจึงเพิ่มรายการเช่นกัน

myList = {'george':16,'amber':19, 'rachel':19, 
           'david':15 }                         #Setting the dictionary
result=[]                                       #Making ready of the result list
search_age = int(input('Enter age '))

for keywords in myList.keys():
    if myList[keywords] ==search_age:
    result.append(keywords)                    #This part, we are making list of results

for res in result:                             #We are now printing the results
    print(res)

และนั่นคือ ...


3
d= {'george':16,'amber':19}

dict((v,k) for k,v in d.items()).get(16)

ผลลัพธ์จะเป็นดังนี้:

-> prints george

[k สำหรับ k, v ใน d.items () ถ้า v == 16]
auro

3

ไม่มีวิธีง่ายๆในการค้นหาคีย์ในรายการโดย 'ค้นหา' ค่า อย่างไรก็ตามหากคุณทราบค่าการวนซ้ำปุ่มคุณสามารถค้นหาค่าในพจนานุกรมโดยองค์ประกอบ หาก D [องค์ประกอบ] โดยที่ D เป็นวัตถุพจนานุกรมเท่ากับกุญแจที่คุณพยายามค้นหาคุณสามารถรันโค้ดบางอย่างได้

D = {'Ali': 20, 'Marina': 12, 'George':16}
age = int(input('enter age:\t'))  
for element in D.keys():
    if D[element] == age:
        print(element)

3

คุณต้องใช้พจนานุกรมและย้อนกลับพจนานุกรมนั้น หมายความว่าคุณต้องการโครงสร้างข้อมูลอื่น ถ้าคุณอยู่ในหลาม 3 ให้ใช้enumโมดูล แต่ถ้าคุณใช้ python 2.7 ใช้enum34ซึ่งเป็นพอร์ตสำรองสำหรับหลาม 2

ตัวอย่าง:

from enum import Enum

class Color(Enum): 
    red = 1 
    green = 2 
    blue = 3

>>> print(Color.red) 
Color.red

>>> print(repr(Color.red)) 
<color.red: 1=""> 

>>> type(Color.red) 
<enum 'color'=""> 
>>> isinstance(Color.green, Color) 
True 

>>> member = Color.red 
>>> member.name 
'red' 
>>> member.value 
1 


2

เพียงแค่คำตอบของฉันในและlambdafilter

filter( lambda x, dictionary=dictionary, search_age=int(search_age): dictionary[x] == search_age  , dictionary )

1

ได้รับคำตอบแล้ว แต่เนื่องจากมีหลายคนพูดถึงการย้อนกลับของพจนานุกรมนี่คือวิธีที่คุณทำในหนึ่งบรรทัด (สมมติว่าการทำแผนที่ 1: 1) และข้อมูล perf ต่างๆ:

หลาม 2.6:

reversedict = dict([(value, key) for key, value in mydict.iteritems()])

2.7+:

reversedict = {value:key for key, value in mydict.iteritems()}

หากคุณคิดว่าไม่ใช่ 1: 1 คุณยังสามารถสร้างการทำแผนที่ย้อนกลับที่สมเหตุสมผลด้วยสองบรรทัด

reversedict = defaultdict(list)
[reversedict[value].append(key) for key, value in mydict.iteritems()]

มันช้าแค่ไหน: ช้ากว่าการค้นหาแบบง่าย ๆ แต่ไม่ช้าอย่างที่คุณคิด - ในพจนานุกรมรายการ 'ตรง' 100000 การค้นหา 'เร็ว' (เช่นการค้นหาค่าที่ควรอยู่ในคีย์ก่อน) เร็วกว่าการย้อนกลับทั้งพจนานุกรมประมาณ 10 เท่าและการค้นหาแบบ 'ช้า' (ไปจนจบ) ประมาณ 4-5x เร็วขึ้น ดังนั้นอย่างมากที่สุดประมาณ 10 การค้นหาก็จ่ายสำหรับตัวเอง

รุ่นที่สอง (พร้อมรายการต่อรายการ) ใช้เวลาประมาณ 2.5 เท่าของรุ่นธรรมดา

largedict = dict((x,x) for x in range(100000))

# Should be slow, has to search 90000 entries before it finds it
In [26]: %timeit largedict.keys()[largedict.values().index(90000)]
100 loops, best of 3: 4.81 ms per loop

# Should be fast, has to only search 9 entries to find it. 
In [27]: %timeit largedict.keys()[largedict.values().index(9)]
100 loops, best of 3: 2.94 ms per loop

# How about using iterkeys() instead of keys()?
# These are faster, because you don't have to create the entire keys array.
# You DO have to create the entire values array - more on that later.

In [31]: %timeit islice(largedict.iterkeys(), largedict.values().index(90000))
100 loops, best of 3: 3.38 ms per loop

In [32]: %timeit islice(largedict.iterkeys(), largedict.values().index(9))
1000 loops, best of 3: 1.48 ms per loop

In [24]: %timeit reversedict = dict([(value, key) for key, value in largedict.iteritems()])
10 loops, best of 3: 22.9 ms per loop

In [23]: %%timeit
....: reversedict = defaultdict(list)
....: [reversedict[value].append(key) for key, value in largedict.iteritems()]
....:
10 loops, best of 3: 53.6 ms per loop

นอกจากนี้ยังมีผลลัพธ์ที่น่าสนใจด้วย ifilter ในทางทฤษฎี ifilter ควรเร็วขึ้นซึ่งเราสามารถใช้ itervalues ​​() และอาจไม่จำเป็นต้องสร้าง / ผ่านรายการค่าทั้งหมด ในทางปฏิบัติผลลัพธ์คือ ... แปลก ...

In [72]: %%timeit
....: myf = ifilter(lambda x: x[1] == 90000, largedict.iteritems())
....: myf.next()[0]
....:
100 loops, best of 3: 15.1 ms per loop

In [73]: %%timeit
....: myf = ifilter(lambda x: x[1] == 9, largedict.iteritems())
....: myf.next()[0]
....:
100000 loops, best of 3: 2.36 us per loop

ดังนั้นสำหรับออฟเซ็ตขนาดเล็กมันเร็วกว่าเวอร์ชั่นก่อนหน้าอย่างมาก (2.36 * u * S และต่ำสุด 1.48 * m * S สำหรับกรณีก่อนหน้านี้) อย่างไรก็ตามสำหรับออฟเซ็ตขนาดใหญ่ใกล้กับจุดสิ้นสุดของรายการมันช้าลงอย่างมาก (15.1ms เทียบกับ 1.48mS เดียวกัน) การออมเล็ก ๆ น้อย ๆ ที่ต่ำสุดนั้นไม่คุ้มกับต้นทุนที่สูง


ฉันต้องการสิ่งนี้มาก (reversedict = defaultdict (รายการ) reversedict [value] .append (key) สำหรับคีย์, ค่าใน largedict.iteritems ()]) เพื่อทำงาน แต่ใช้ Python 2.7.3 ฉันได้รับข้อผิดพลาดทางไวยากรณ์ของคำ 'for'
slashdottir

นั่นคือสิ่งที่คุณพิมพ์จริงหรือ คุณจะหายไป[ถ้ามันเป็น มิฉะนั้นตรวจสอบให้แน่ใจว่าเป็นสองบรรทัดหรือใส่;ระหว่างสองบรรทัดหากไม่ใช่
Corley Brigman

1

บางครั้ง int () อาจต้องการ:

titleDic = {'Фильмы':1, 'Музыка':2}

def categoryTitleForNumber(self, num):
    search_title = ''
    for title, titleNum in self.titleDic.items():
        if int(titleNum) == int(num):
            search_title = title
    return search_title

1

นี่คือโซลูชันที่ใช้งานได้ทั้งใน Python 2 และ Python 3:

dict((v, k) for k, v in list.items())[search_age]

ส่วนจนกระทั่ง[search_age]สร้างพจนานุกรมย้อนกลับ (โดยที่ค่าคือคีย์และในทางกลับกัน) คุณสามารถสร้างวิธีการช่วยเหลือซึ่งจะแคชพจนานุกรมที่กลับรายการดังนี้:

def find_name(age, _rev_lookup=dict((v, k) for k, v in ages_by_name.items())):
    return _rev_lookup[age]

หรือโดยทั่วไปแล้วโรงงานที่จะสร้างวิธีค้นหาชื่อตามอายุสำหรับรายชื่อของคุณอย่างน้อยหนึ่งรายการ

def create_name_finder(ages_by_name):
    names_by_age = dict((v, k) for k, v in ages_by_name.items())
    def find_name(age):
      return names_by_age[age]

ดังนั้นคุณจะสามารถทำ:

find_teen_by_age = create_name_finder({'george':16,'amber':19})
...
find_teen_by_age(search_age)

หมายเหตุว่าผมเปลี่ยนlistไปages_by_nameตั้งแต่อดีตเป็นชนิดที่กำหนดไว้ล่วงหน้า


1

นี่คือวิธีที่คุณเข้าถึงพจนานุกรมเพื่อทำสิ่งที่คุณต้องการ:

list = {'george': 16, 'amber': 19}
search_age = raw_input("Provide age")
for age in list:
    if list[age] == search_age:
        print age

แน่นอนว่าชื่อของคุณปิดไปแล้วดูเหมือนว่ามันจะเป็นการพิมพ์อายุ แต่มันพิมพ์ชื่อ เนื่องจากคุณกำลังเข้าถึงโดยใช้ชื่อจะเข้าใจได้ง่ายขึ้นถ้าคุณเขียน:

list = {'george': 16, 'amber': 19}
search_age = raw_input("Provide age")
for name in list:
    if list[name] == search_age:
        print name

ดีกว่า:

people = {'george': {'age': 16}, 'amber': {'age': 19}}
search_age = raw_input("Provide age")
for name in people:
    if people[name]['age'] == search_age:
        print name

1
dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
key = [filter( lambda x: dictionary[x] == k  , dictionary ),[None]][0] 
# key = None from [None] which is a safeguard for not found.

สำหรับหลายเหตุการณ์ให้ใช้:

keys = [filter( lambda x: dictionary[x] == k  , dictionary )]

*** NameError: global name 'dictionary' is not defined
Bishwas Mishra

filter( lambda x, dictionary=dictionary, search_age=int(search_age): dictionary[x] == search_age , dictionary )
Bishwas Mishra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.