অভিধানে মান অনুসারে কী পান


632

আমি একটি ফাংশন তৈরি করেছি যা বয়সগুলি সন্ধান করবে 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 এর কারণে পেয়ে যাচ্ছি I আমি জানি এটি সঠিক নয় তবে কীভাবে এটি পিছন দিকে অনুসন্ধান করা যায় তা আমি বুঝতে পারি না।



আপনি একটি অভিধানে এর সংজ্ঞা অনুসারে একটি শব্দ খুঁজে পাবেন? নাঃ।
জেসি ক্যাল্ডেরন

উত্তর:


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
আমি সম্মত নই ... নীচে অজফের উত্তর আরও গঠনমূলক। পুরোপুরি যুক্তিসঙ্গত ব্যবহারের ক্ষেত্রটি "অযৌক্তিক" নয় (তালিকা বোঝাপড়া যাইহোক এই জাতীয় ব্যবহারের ক্ষেত্রে ফিট করে)। একটি dictবিভিন্ন সময়ে একাধিক জিনিসের জন্য হতে পারে; কী এবং মানগুলির অবশ্যই একটি স্পষ্ট অর্থ রয়েছে তবে " dictপ্রদত্ত মান সহ আইটেমগুলি" একটি সম্পূর্ণ যুক্তিসঙ্গত অনুরোধ। জোড়ের তালিকা ব্যবহারের সুপারিশটি এমন একটি প্রসঙ্গটি বাতিল করবে যে একটি আইটেম অন্যটির থেকে ' সংজ্ঞা ', যেমন প্যারামিটার তালিকায় ...
লুই ম্যাডডক্স

1
আমি এই উত্তরের সাথে একমত নই। সত্য যে এটি একটি সম্ভাবনা, স্ট্যানিও এলসনের উত্তরে যেমন দেখানো হয়েছে, তা বোঝায় না যে এটি এরূপ হিসাবে ব্যবহার করার ইচ্ছা ছিল না। মোটেই সহায়ক নয়।
ট্রপিক্যালামবলার

এর সংজ্ঞা অনুসারে আপনি কি অভিধানে একটি শব্দ খুঁজে পাবেন? নাঃ। @ ট্রপিক্যালামবলার
জেসি ক্যাল্ডারন

যদিও আপনার একটি বক্তব্য আছে যে একটি শব্দ অভিধানের জন্য একটি স্ট্যান্ডার্ড ব্যবহার শব্দের সংজ্ঞাটি শব্দ = কী এবং সংজ্ঞা = মান দিয়ে সন্ধান করা, আজকের প্রোগ্রামিং ভাষাগুলি আপনাকে প্রয়োজনে মান অনুসারে অনুসন্ধান করতে সক্ষম করে। যদি আপনি একটি কী দিয়ে কাজ করছেন: মান জোড় অবজেক্ট (যেকোনও ভাষাতেই এটি নাম, ডুপ্পল, যেকোন নামেই ডাকুন)। অজগর, এটি সত্য যে আপনি এখনও কাঠামোর মানগুলির সাথে সংশ্লিষ্ট কীগুলি খুঁজে বের করতে পারেন।
ট্রপিক্যালামব্লার

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

বা পাইথন 3.x এ:

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

মূলত, এটি অভিধানের অভিধানের মানগুলি একটি তালিকায় পৃথক করে, আপনার যে মান রয়েছে তার অবস্থানটি খুঁজে পায় এবং সেই অবস্থানে কীটি পায়।

পাইথন 3 সম্পর্কে keys()এবং আরও .values(): আমি ডিক থেকে মানগুলির তালিকা কীভাবে পেতে পারি?


23
দুর্দান্ত দেখায় তবে কি সবসময় কাজ করে? আমি কি করতে মানে list.keys()এবং list.values()ফাংশন একই আদেশ আইটেম উৎপন্ন?
ইস্কোরুম

17
হ্যাঁ, তারা ধারাবাহিক হওয়ার গ্যারান্টিযুক্ত। অতিরিক্ত হিসাবে অর্ডারটি যতক্ষণ না অভিধান সংশোধন না করা হয় পুনরাবৃত্তির মাধ্যমে পরিবর্তন না করার গ্যারান্টিযুক্ত।
Veedrac

9
এটি দেখতে একটি ভাল সমাধান বলে মনে হচ্ছে তবে সূচক কেবলমাত্র একটি মান দিয়েছিল, তাই যদি আপনি একাধিক সমান মান রাখেন, তবে এটি একাধিক কীগুলি সঠিকভাবে ফেরত দেওয়া উচিত?
জেমস সাপাম

12
@ আর্টঅফ ওয়ার্ফার ডকস.পিথন.অর্গ / ৩ / লাইবারি / স্টাডটাইপস html # ডিক্ট- ভিউস , "কীগুলিতে, মান এবং আইটেমের দর্শনগুলি অভিধানে কোনও হস্তক্ষেপ পরিবর্তন না করে পুনরাবৃত্তি করা হয়, তবে আইটেমের ক্রম সরাসরি মিলবে " "
Veedrac

5
@ সাইনকোনটা: এটি এখনও ফণার নীচে একটি ব্যয়বহুল লুপ সম্পাদন করে; লুপটি কেবল indexপদ্ধতির অভ্যন্তরে লুকিয়ে রয়েছে ।
ব্যবহারকারী 2357112

252

আপনি যদি নাম এবং বয়স উভয়ই চান .items()তবে আপনার ব্যবহার করা উচিত যা আপনাকে কী (key, value)টিপলস দেয় :

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

আপনি ডানদিকে দুটি পৃথক ভেরিয়েবল মধ্যে টিপল আনপ্যাক করতে পারেন 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দীর্ঘ হয় এবং আপনি পাইথন 2 এ থাকেন তবে আপনার .iteritems()পরিবর্তে .items()ক্যাট প্লাস প্লাস যেমনটি করেছিলেন তার পরিবর্তে আপনার ব্যবহার করা উচিত , কারণ এটির তালিকাটির অনুলিপি তৈরি করার দরকার নেই।


9
সঠিক, তবে আপনি লিনিয়ার অনুসন্ধান করতে যাচ্ছেন, আপনি জোড়গুলির dictএকটি তালিকা সহ সেইসাথে প্রতিস্থাপন করতে পারেন ।
ফ্রেড ফু

9
আপনার সাধারন ক্রিয়াটি নাম অনুসারে যুগে যুগে তল্লাশি না করা সেক্ষেত্রে এক্ষেত্রে dictবোঝা যায়।
agf

2
এটি অনুমান করা অদ্ভুত বলে মনে হয় যে প্রতিটি বয়সের সাথে একজনই রয়েছেন, অন্যদিকে, প্রতিটি ব্যক্তির একক বয়স হওয়া সম্পূর্ণ যৌক্তিক।
ড্যানিড

@ ড্যানিড হ্যাঁ, তবে সমস্যাটি সহজেই সাধারণ করা যায়। উদাহরণস্বরূপ, আপনার কাছে অনন্য কী এবং তাদের সম্পর্কিত অনন্য মানগুলির সাথে সন্ধানের টেবিল থাকতে পারে। তারপরে আপনি প্রতিসাম্যিকভাবে জিনিসগুলি সন্ধান করতে পারেন value --> keyবাkey --> value
pfabri

67

আমি ভেবেছিলাম যে কোন পদ্ধতিটি সবচেয়ে দ্রুত এবং কোন পরিস্থিতিতে দৃ point়ভাবে উল্লেখ করা আকর্ষণীয় হবে:

আমি যে কয়েকটি টেস্ট চালিয়েছি তা এখানে (২০১২ ম্যাকবুক প্রোতে)

>>> 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()প্রতিটি পদ্ধতিতে 100000 বার থেকে ফলাফল :

পদ্ধতি 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

সুতরাং এটি দেখায় যে একটি ছোট ডিকের জন্য, পদ্ধতি 1 দ্রুততম। এটি সম্ভবত সম্ভবত কারণ এটি ম্যাচ 2 এর মতো সমস্ত ম্যাচের বিপরীতে প্রথম ম্যাচটি ফেরত দেয় (নীচের নোটটি দেখুন)।


মজার বিষয় হচ্ছে, 2700 এন্ট্রি সহ আমার যে ডিকের উপর একই পরীক্ষা করা হচ্ছে, আমি বেশ আলাদা ফলাফল পেয়েছি (এবার 10000 বার চালানো):

পদ্ধতি 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 খুব দ্রুত। আপনার ডিকের আকারটি প্রদর্শন করতে যান আপনি কোন পদ্ধতিটি চয়ন করবেন তা প্রভাবিত করবে।

নোটস: পদ্ধতি 2 সমস্ত নামের একটি তালিকা প্রদান করে , যেখানে 1 এবং 3 পদ্ধতিগুলি কেবল প্রথম ম্যাচটি দেয় return আমি স্মৃতি ব্যবহার বিবেচনা করি নি। আমি নিশ্চিত নই যে পদ্ধতি 3 2 টি অতিরিক্ত তালিকা (কী () এবং মান ()) তৈরি করে এবং এগুলিকে মেমরিতে সঞ্চয় করে in


6
কেবলমাত্র একটি আপডেট: এটি দেখে মনে হচ্ছে যে ডিক.ভালিউস () এবং ডিক.কেজ () উভয়ই রিটার্নের তালিকা প্রকাশ করে যা মূল ডিক থেকে অবজেক্টগুলিকে উল্লেখ করে, সুতরাং পদ্ধতি 3 এছাড়াও ন্যূনতম স্মৃতি ব্যবহার করে (এটি কেবল দুটি পাতলা তালিকার অবজেক্ট তৈরি করে) যা ডিক্টের বিষয়বস্তু মোড়ানো, অন্যরা পুনরাবৃত্তকারী আইটেমগুলি তৈরি করে
প্যাট্রিক

আমি কেবল এটি নিজেই বেঞ্চমার্ক করতে চেয়েছিলাম, স্ক্রোল করে নীচে রেখেছি, আপনার কাছে এটি আছে। ধন্যবাদ! প্রযুক্তিগতভাবে আপনি ইতিমধ্যে দেখিয়েছেন পদ্ধতি 2 1 এবং 3 এর মতো ঠিক একই কাজ করে না কারণ এটি সমস্ত মিল দেয়। উদাহরণস্বরূপ পরবর্তী ফিরে ([..]) এর ফলাফল দেখতে ভাল লাগবে।
ব্লুবি_এমডি

আর একটি গুরুত্বপূর্ণ নোটটি তৈরি করার জন্য পাইথন সংস্করণ। আমি জানি কিছু সংস্করণে অন্যগুলির তুলনায় পদ্ধতিগুলির আরও কার্যকর প্রয়োগ রয়েছে।
আর্টঅফ ওয়ারফেয়ার

@ পেট্রিক: সমস্ত পদ্ধতি মান এবং কীগুলির জন্য সরাসরি উল্লেখগুলি ব্যবহার করে, কারওর সাথে কোনও স্মৃতির সুবিধা নেই advantage পাইথন 3 এবং .keys()` .values()ফেরত অভিধানের দর্শন ব্যতীত হালকা ওজন-
মার্টিজন পিটারস

53

একটি লাইন সংস্করণ: (আমি একটি পুরানো অভিধান, পি একটি বিপরীত অভিধান)

ব্যাখ্যা: i.keys()এবং i.values()অভিধানের কী এবং মানগুলির সাথে দুটি তালিকাকে যথাক্রমে প্রদান করে। জিপ ফাংশনটিতে অভিধান তৈরি করার জন্য তালিকাগুলি একসাথে বেঁধে রাখার ক্ষমতা রয়েছে।

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

সতর্কতা: মানগুলি হ্যাশযোগ্য এবং অনন্য হলে কেবল এটি কাজ করবে।


হ্যাঁ, এই কাজ করবে: stackoverflow.com/questions/835092/...
দ্য Unfun বিড়াল

17
... এবং যখন কোনও সদৃশ মান নেই।
এলী

3
সুন্দর। উপরের মন্তব্যটি রচনা করুন, অবশ্যই এটি কেবল তখনই কাজ করে যখন কোনও সদৃশ মান নেই, তবে তারপরে, এই থ্রেডটি যে প্রশ্নটি শুরু করেছিল তা অনুমান করে যে আমাদের এক-টু-ওয়ান ফাংশন রয়েছে, সুতরাং এই অনুমিতি দেওয়া, এটি সর্বাধিক মার্জিত এখন পর্যন্ত প্রতিক্রিয়া।
জন স্ট্রং

1
হ্যাশেবল মানগুলিতে প্রসারিত: যদি আপনার মানগুলি তালিকাগুলি / সেট হয় তবে এগুলি কাজ করতে টিপলগুলিতে রূপান্তর করে (তাদের এখনও অনন্য হওয়া দরকার) need
মিউন

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
যদি অন্য কী থাকে যা একই মান ধারণ করে? পাইথোনিক উপায় হতে পারে। তবে ভাল ধারণা নয়।
এইচ 3 IN5ID3R

ভাল কথা, আমি সমাধান যুক্ত করেছি যা অদ্বিতীয় মানগুলির সাথে কাজ করে
জেলেন

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

আমি কি একই লাইনে 'অন্য' থাকতে পারি? মামলার জন্য যখন আমার মান ডিক মানগুলিতে নেই
সৃস্টি গুপ্ত

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

14

অভিধানের বিপরীতে এই ওয়ান-লাইনার ব্যবহার করে দেখুন:

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

1
এটি আমার এনক্রিপশন এবং ডিক্রিপশন প্রোগ্রামের জন্য দুর্দান্ত কাজ করেছে, আপনাকে ধন্যবাদ!
খ্রিস্টান আর


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_ageপরের লাইনে সংজ্ঞায়িত ভার ব্যবহার করেন না ... সম্ভবত আপনার valueসাথে প্রতিস্থাপন করা উচিত search_age?
অ্যান্ডারসন

2
আমি এই ত্রুটিটি পেয়েছি: 'ডিক্ট_ভ্যালুস' অবজেক্টটির কোনও 'ইন্ডেক্স' নেই
নীল_সামগ্রী

@ ব্লু_ এলিফ্যান্ট আপনি দয়া করে কোড স্নিপেট সরবরাহ করতে পারেন যে আপনি ত্রুটি পেয়েছেন এবং পাইথন সংস্করণ (এর মুদ্রণটিও কার্যকর type(dict_values)হবে)?
Andriy Ivaneyko

9

এই সমস্যাটি সম্পর্কে আমার গ্রহণযোগ্যতা এখানে। :) আমি সবেমাত্র পাইথন শিখতে শুরু করেছি, তাই আমি এটি কল করেছি:

"নতুনদের জন্য বোধগম্য" সমাধান।

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

ভাল এক-লাইনার। যাইহোক, isশুধুমাত্র (singletons এর সমতা পরীক্ষার জন্য ব্যবহার করা উচিত None, True, Falseইত্যাদি)। সিপিথন স্ট্রিং আক্ষরিক পুনরায় ব্যবহার করে (এবং তাই 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

পান্ডাস ব্যবহার বিবেচনা করুন। উইলিয়াম ম্যাককিনির "ডেটা অ্যানালাইসিসের জন্য পাইথন" তে যেমন বলা হয়েছে

সিরিজ সম্পর্কে ভাবার আরেকটি উপায় হ'ল স্থির দৈর্ঘ্য, আদেশযুক্ত ডিক হিসাবে এটি ডেটা মানগুলিতে সূচকের মানগুলির ম্যাপিং। এটি অনেকগুলি প্রসঙ্গে ব্যবহার করা যেতে পারে যেখানে আপনি ডিক ব্যবহার করতে পারেন।

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)

তিনি পান্ডসের স্রষ্টা। যদিও তিনি ওয়েস নামে বেশি পরিচিত।
এক্সেল

6

এখানে, অভিধানে সন্ধানের জন্য পুনরুদ্ধার_কি অভিধান এবং মান নেয়। তারপরে আমরা অভিধানের কীগুলি লুপ করব এবং মানটির সাথে একটি তুলনা করব এবং সেই নির্দিষ্ট কীটি ফিরিয়ে দেব।

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
লুপ এবং সংযোজনের জন্য একটি তালিকা বোধগম্যতার চেয়ে ধীর এবং এটি আরও দীর্ঘ।
alexpinho98


3

এটির উত্তর দেওয়া হয়েছে, তবে এটি অভিনব 'মানচিত্র / হ্রাস' ব্যবহারের মাধ্যমে করা যেতে পারে, যেমন:

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

ক্যাট প্লাস প্লাস উল্লেখ করেছে যে কোনও অভিধান ব্যবহার করার উদ্দেশ্যে এটি কী তা নয়। কারণটা এখানে:

অভিধানের সংজ্ঞা গণিতের ম্যাপিংয়ের সাথে সাদৃশ্যপূর্ণ। এই ক্ষেত্রে, একটি ডিকটি কে (কীগুলির সেট) কে ভি (মানগুলি) এর ম্যাপিং - তবে বিপরীতে নয়। আপনি যদি কোনও ডিককে অবজ্ঞা করেন, আপনি ঠিক এক মান প্রত্যাশিত প্রত্যাশা করবেন। তবে, বিভিন্ন কীগুলি একই মানের মানচিত্রের জন্য একেবারে আইনী, যেমন:

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

এটি সম্পর্কিত মান অনুসারে আপনি কোনও কী সন্ধান করেন, আপনি মূলত অভিধানটি উল্টাচ্ছেন। তবে একটি ম্যাপিং অবিচ্ছিন্নভাবে পরিবর্তনযোগ্য নয়! এই উদাহরণে, ভি 1 এর সাথে সম্পর্কিত কী জিজ্ঞাসা করলে কে 1 বা কে 3 পাওয়া যাবে। আপনি উভয় ফেরত দেওয়া উচিত? প্রথমটি কি পাওয়া গেল? এজন্য অভিধানের জন্য সূচিপত্র অপরিজ্ঞাত।

আপনি যদি আপনার ডেটা জানেন তবে আপনি এটি করতে পারেন। তবে একটি এআইপি এটি ধরে নিতে পারে না যে একটি স্বেচ্ছাসেবী অভিধানটি অবিচ্ছিন্ন, সুতরাং এই জাতীয় অপারেশনের অভাব।


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

[কে, কে, ভি ইন ডি.আইটিমেসে () যদি v == 16]
অরো

3

মানটি 'অনুসন্ধান করে' তালিকার কোনও কী খুঁজে পাওয়ার সহজ উপায় নেই। যাইহোক, যদি আপনি কীগুলি দিয়ে পুনরুক্তি করে মানটি জানেন তবে আপনি উপাদানটির সাহায্যে অভিধানে মানগুলি সন্ধান করতে পারেন। যদি ডি [এলিমেন্ট] যেখানে ডি অভিধানের বস্তু হয় তবে আপনি যে কীটির সন্ধানের চেষ্টা করছেন তার সমান হলে আপনি কিছু কোড কার্যকর করতে পারেন।

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মডিউলটি ব্যবহার করুন তবে আপনি পাইথন ২.7 ব্যবহার করছেন enum34যা পাইথন ২ এর জন্য ফিরে পোর্ট করা আছে।

উদাহরণ:

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 



1

ইতিমধ্যে উত্তর দেওয়া হয়েছে, তবে যেহেতু বেশিরভাগ লোক অভিধানটি উল্টে দেওয়ার কথা উল্লেখ করেছে, আপনি এখানে এটি কীভাবে এক লাইনে করেন (1: 1 ম্যাপিং ধরে নিচ্ছেন) এবং কিছু বিভিন্ন পারফেক্ট ডেটা:

অজগর ২.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 এন্ট্রি অভিধানে, একটি 'দ্রুত' অনুসন্ধান (অর্থাত্ কীগুলির প্রথম দিকে হওয়া উচিত এমন কোনও মান সন্ধান করা) পুরো অভিধানটি উল্টানোর চেয়ে প্রায় 10x দ্রুত এবং 'ধীর' অনুসন্ধান (শেষের দিকে) প্রায় 4-5x দ্রুত ছিল। সুতরাং প্রায় 10 টি দেখার পরে, এটি নিজের জন্য প্রদান করা হয়।

দ্বিতীয় সংস্করণ (প্রতিটি আইটেমের তালিকা সহ) সাধারণ সংস্করণ হিসাবে প্রায় 2.5x সময় নেয় 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

সুতরাং, ছোট অফসেটগুলির জন্য, এটি আগের কোনও সংস্করণের তুলনায় নাটকীয়ভাবে দ্রুত ছিল (পূর্ববর্তী ক্ষেত্রে ন্যূনতম 1.48 * মি * এস)। তবে, তালিকার শেষের নিকটে বড় অফসেটগুলির জন্য, এটি নাটকীয়ভাবে ধীরে ধীরে ছিল (15.1 মিমি বনাম একই 1.48 মিএস)। স্বল্প প্রান্তে ছোট সঞ্চয় উচ্চ প্রান্তে ব্যয় করা যায় না, ইমো।


আমি এটিকে (বিপরীতমুখী = ডিফল্টডিক্ট (তালিকা) বিপরীত [মান]। কীটির জন্য অ্যাপ্লিকেশন (কী), লার্জডিক্ট.পিটারাইটেমস ()] এর মান কাজ করতে চাইছি তবে পাইথন ২.7.৩ ব্যবহার করে আমি শব্দটিতে সিনট্যাক্স ত্রুটি পেয়েছি 'জন্য'
স্ল্যাশডটটিয়ার

আপনি কি আসলে টাইপ করেছেন? [যদি এটি হয় তবে আপনি এটির একটি মিস করছেন । অন্যথায়, এটি দুটি লাইনে রয়েছে তা নিশ্চিত করুন বা ;এটি না থাকলে তাদের মধ্যে একটি রাখুন ।
করলি ব্রিগম্যান

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

পাইথন 2 এবং পাইথন 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
বিশ্ব মিশ্র

filter( lambda x, dictionary=dictionary, search_age=int(search_age): dictionary[x] == search_age , dictionary )
বিশ্ব মিশ্র
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.