ইতিমধ্যে উত্তর দেওয়া হয়েছে, তবে যেহেতু বেশিরভাগ লোক অভিধানটি উল্টে দেওয়ার কথা উল্লেখ করেছে, আপনি এখানে এটি কীভাবে এক লাইনে করেন (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 মিএস)। স্বল্প প্রান্তে ছোট সঞ্চয় উচ্চ প্রান্তে ব্যয় করা যায় না, ইমো।