আমি কীভাবে কোনও অভিধানে মানগুলির সাথে বিনিময় করব?


101

আমি ইনপুট হিসাবে একটি অভিধান পেয়েছি এবং একটি অভিধানটি ফিরিয়ে দিতে চাই যার কীগুলি ইনপুটটির মান হবে এবং যার মান হবে সংশ্লিষ্ট ইনপুট কীগুলি। মানগুলি অনন্য।

উদাহরণস্বরূপ, আমার ইনপুটটি বলুন:

a = dict()
a['one']=1
a['two']=2

আমি আমার আউটপুট হতে চাই:

{1: 'one', 2: 'two'}

স্পষ্ট করতে আমি আমার ফলাফলটি নীচের সমতুল্য হতে চাই:

res = dict()
res[1] = 'one'
res[2] = 'two'

এটি অর্জনের জন্য কোনও ঝরঝরে পাইথোনিক উপায়?


4
অজানা প্রশ্নের জন্য stackoverflow.com/questions/1087694/… দেখুন, আপনি যদি পাইথন 3 ব্যবহার করছেন তবে চমৎকার উত্তর রয়েছে
স্টিফেন এডমন্ডস

@ স্টিফেন: দ্বিতীয় সর্বাধিক ভোট দেওয়া উত্তরটি দেখুন, আপনি যে প্রশ্নটির সাথে লিঙ্ক করেছেন তাতে গৃহীত উত্তরটির সমান। জনতা যদিও অন্য উত্তরটি পছন্দ করেছে ...
রই অ্যাডলার

4
পাইথন পার্ল নয়, পাইথন রুবি নয়। পঠনযোগ্যতা গণনা। গা Sp়ের চেয়ে বিরাগই ভাল। এটি দেওয়া, এই উত্তরগুলির সমস্ত পদ্ধতি কেবল খারাপ ™; প্রশ্নে একটি হ'ল সেরা উপায়।
o0 '

উত্তর:


154

পাইথন 2:

res = dict((v,k) for k,v in a.iteritems())

পাইথন 3 (@ এরিককে ধন্যবাদ):

res = dict((v,k) for k,v in a.items())

15
যদিও এটি সঠিক বলে মনে হচ্ছে, কেবল কোডের চেয়ে এটি কীভাবে কাজ করে তার একটি ব্যাখ্যা যুক্ত করা সত্যিই ভাল।
উইল

4
মান যদি অনন্য না হয়? তারপরে কীগুলি একটি তালিকা হওয়া উচিত ... উদাহরণস্বরূপ: d = {'a': 3, 'বি': 2, 'সি': 2 এর জন্য ডি, ডায়িটারাইটেম () v v 2: 'বি', 3: 'এ'} হওয়া উচিত {2: ['বি', 'সি'], 3: 'এ'}
হানান শ্টিংগার্ট

4
@ হানানশটিইগার্ট: ওপির প্রশ্নের বিবৃত মানগুলি অনন্য। দয়া করে আপনার মামলার জন্য একটি পৃথক প্রশ্ন পোস্ট তৈরি করুন (এবং এটি অন্য ব্যক্তির পক্ষে এখানে যুক্ত করুন)।
লাইওরি

পাইথন 2 কোডটি কাজ করে ... তবে তালিকাটি বোঝাপড়াটি অনুপস্থিত [এবং ]। একটি তালিকা বোঝার জন্য [এবং প্রয়োজন হয় না ]?
ট্রেভর বয়েড স্মিথ

@ ট্র্যাভারবয়েডস্মিথ: এটি তালিকা উপলব্ধি নয়, এটি একটি জেনারেটর এক্সপ্রেশন
লাইওরি

56
new_dict = dict(zip(my_dict.values(), my_dict.keys()))

4
সত্যই কি মানগুলি () এবং কীগুলি () একই অর্ডার করার গ্যারান্টিযুক্ত?
লেনার্ট রেজেব্রো

4
হ্যাঁ, পাইথন.আর্গ / দেবদেবী / পেপস / পেপ ৩৩০6 থেকে স্পেসিফিকেশনটি সূচিত করে যে আইটেমগুলি .keys (),। মূল্যবোধগুলি () এবং .items () দ্বারা যে ক্রমগুলি ফেরত পাঠানো হয়েছে সেভাবে একই (যেমনটি পাইথনে ছিল ২.x), কারণ আদেশটি সমস্ত ডিক পুনরুক্তিকারক (যা সম্ভবত নির্বিচারে তবে ডিক সংশোধন না করা স্থিতিশীল) থেকে প্রাপ্ত। তবে এই উত্তরে আমার_ডিক্টকে দু'বার কল করতে হবে (মানগুলির জন্য একটি, কীগুলির জন্য একটি)। সম্ভবত এটি আদর্শ নয়।
সানকিয়াং

4
হ্যাঁ, এই উত্তরটি ডিকের মাধ্যমে দুবার পুনরাবৃত্তি হয়। সানকিয়াংয়ের উত্তরটি একটি বৃহত অভিধানের পক্ষে পছন্দনীয় কারণ এটির জন্য কেবল একটি পুনরাবৃত্তি প্রয়োজন।
কার্ল মায়ার

@ কার্ল মায়ার: সম্মত হন, তিনি ইটারটুলগুলি ব্যবহার করছেন যা বড় ডেটাসেটের জন্য অনেক ভাল। যদিও আমি অবাক হয়েছি যে চূড়ান্ত ডিক () কলটিও স্ট্রিমিং করছে, বা এটি যদি প্রথম জুটির তালিকাটি একত্রিত করে
জাভিয়ের

@ কার্লমিয়ার অতিরিক্তভাবে এন> 1 ই 6 (বা 1e9) এর জন্য মেমরির ব্যবহারও সত্যই বড় হবে ... এবং এটিকে একগুচ্ছ করে দিন।
ট্রেভর বয়ড স্মিথ

47

পাইথন ২.7 থেকে 3.0+ সহ, এখানে একটি যুক্তিযুক্ত সংক্ষিপ্ততর, আরও পাঠযোগ্য সংস্করণ রয়েছে:

>>> my_dict = {'x':1, 'y':2, 'z':3}
>>> {v: k for k, v in my_dict.items()}
{1: 'x', 2: 'y', 3: 'z'}

30
In [1]: my_dict = {'x':1, 'y':2, 'z':3}

In [2]: dict((value, key) for key, value in my_dict.iteritems())
Out[2]: {1: 'x', 2: 'y', 3: 'z'}

4
মূল প্রশ্নে নয়, আমি কেবল কৌতূহল করছি যে আপনি যদি মূল অভিধানে সদৃশ মানগুলি ব্যবহার করেন এবং তারপরে কী / মানগুলি এই পদ্ধতির সাথে অদলবদল করেন তবে কি হবে?
আন্দ্রে মিলার

4
@ আন্ডার মিলার: এটি নির্দিষ্ট কীটির শেষ ঘটনাটি গ্রহণ করে: ডিক (((1,3), (1,2))) == {1: 2}
বালফা

4
ডুপ্লিকেটগুলি শেষ মুখোমুখি ডুপের সাথে ওভাররাইট করা হবে।
ক্রিস্টোফার

4
@ আন্ড্রে মিলার: এবং কারণ d.items () আইটেমকে একটি স্বেচ্ছামূলক ক্রমে ফিরিয়ে দেয় আপনি সদৃশ মানগুলির জন্য একটি স্বেচ্ছা কী পান।
এন্টস আসমা

আমি মনে করি যে এটি শেষ কী, এটি পাওয়া যায় এমন মান জোড়ায় নেবে। এটা কেমন একটি [ 'X] = 3. তারপর আপনার সেট করা একটি [' X] = 4.
riza

28

আপনি ডিক বোধগম্যতা ব্যবহার করতে পারেন :

res = {v: k for k, v in a.iteritems()}

সম্পাদিত: পাইথন 3 এর a.items()পরিবর্তে ব্যবহার করুন a.iteritems()। তাদের মধ্যে পার্থক্য সম্পর্কে আলোচনা এসও-তে পাইথনের ইটারাইটেমগুলিতে পাওয়া যাবে ।


18

আপনি চেষ্টা করতে পারেন:

d={'one':1,'two':2}
d2=dict((value,key) for key,value in d.iteritems())
d2
  {'two': 2, 'one': 1}

আপনি যদি কোনও অভিধান 'বিপরীত' করতে না পারেন তবে সাবধান হন

  1. একাধিক কী একই মান শেয়ার করে। উদাহরণস্বরূপ {'one':1,'two':1}। নতুন অভিধানে কী সহ একটি আইটেম থাকতে পারে 1
  2. এক বা একাধিক মান অদলীয়। উদাহরণস্বরূপ {'one':[1]}[1]একটি বৈধ মান তবে বৈধ কী নয়।

বিষয়টিতে আলোচনার জন্য পাইথন মেলিং তালিকায় এই থ্রেডটি দেখুন ।


মূল ডিকের মানগুলি অনন্য কিনা তা নিশ্চিত করার বিষয়ে নোটটি সম্পর্কে +1; অন্যথায় আপনি 'বিপরীত' ডিকটিতে ওভাররাইট পেয়ে যাবেন ... এবং এটি (আমি কেবল এটি আমার ব্যয়ের সাথে খুঁজে পেয়েছি) আপনার কোডটিতে জটিল বাগগুলি তৈরি করতে পারে!
মনোজোহনি

17

বর্তমানের শীর্ষস্থানীয় উত্তরগুলি মানগুলি অনন্য বলে মনে করে যা সর্বদা ক্ষেত্রে হয় না। মান যদি অনন্য না হয়? আপনি তথ্য আলগা হবে! উদাহরণ স্বরূপ:

d = {'a':3, 'b': 2, 'c': 2} 
{v:k for k,v in d.iteritems()} 

আয় {2: 'b', 3: 'a'}

সম্পর্কে তথ্য 'c'সম্পূর্ণ উপেক্ষা করা হয়েছিল। আদর্শভাবে এটি কিছু ছিল {2: ['b','c'], 3: ['a']}। নীচের বাস্তবায়ন এটিই করে।

পাইথন 2.x

def reverse_non_unique_mapping(d):
    dinv = {}
    for k, v in d.iteritems():
        if v in dinv:
            dinv[v].append(k)
        else:
            dinv[v] = [k]
    return dinv

পাইথন 3.x

def reverse_non_unique_mapping(d):
    dinv = {}
    for k, v in d.items():
        if v in dinv:
            dinv[v].append(k)
        else:
            dinv[v] = [k]
    return dinv

এই সঠিক উত্তর হওয়া উচিত যেহেতু এটি একটি সাধারণ ক্ষেত্রে কভার
লিওন রাই

এই জন্য আপনাকে ধন্যবাদ! অন্যান্য সমাধানগুলির সাথে আমি তথ্য হারাচ্ছিলাম।

15

res = dict(zip(a.values(), a.keys()))


4
ডিক গ্যারান্টি দেয় না যে এর মানগুলি () এবং কীগুলি () একই ক্রমে উপাদানগুলি ফিরিয়ে দেবে। এছাড়াও, কী (), মান () এবং জিপ () একটি তালিকা ফেরত দেয়, যেখানে কোনও পুনরুক্তিকারী পর্যাপ্ত হবে।
লাইওরি

19
@ লিওরি: আপনি ভুল বলেছেন। ডিক গ্যারান্টি দেয় যে এর মানগুলি () এবং কীগুলি () একই আদেশে থাকবে, যদি আপনি অবশ্যই মানগুলিতে কলগুলি () এবং কী () এর মধ্যে ডিকটি পরিবর্তন না করেন। ডকুমেন্টেশনে বলা হয়েছে যে এখানে: ("নোট" অংশটি পড়ুন: ডকস.পিথথন.আর / লাইবারি / স্টাডটাইপস html#dict.items ) "যদি আইটেম (), কী (), মান (), ইটারাইটাম (), ইতরকি ( ), এবং itervalues ​​() অভিধানে কোনও অন্তর্বর্তী পরিবর্তন ছাড়া ডাকা হয়, তালিকাগুলি সরাসরি সম্পর্কিত হবে। "
nosklo

4
ঠিক আছে, তাহলে আমি ভুল ... আমি অনলাইন ডক্স পরীক্ষা করে দেখিনি। এটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ।
লাইওরি

আপনি উত্তরটি আরও কার্যকর করতে জিপের পরিবর্তে পুনরাবৃত্তির itertools.izip ব্যবহার করতে পারেন।
আলাসদায়ের

এবং iterkeys এবং itervalues। তবে ঠিক পাশাপাশি ইটারাইটেমগুলি ()
nosklo

14
new_dict = dict( (my_dict[k], k) for k in my_dict)

বা আরও ভাল, তবে কেবল পাইথন 3 এ কাজ করে:

new_dict = { my_dict[k]: k for k in my_dict}

4
পাইথন ২.ict এর সাথেও ডিক্ট কমারহেনশনস ( পিইপি 274 ) কাজ করে।
আর্সেনি

10

ইলিয়া প্রকিনের প্রতিক্রিয়ার উপর প্রসারিত করার আরেকটি উপায় হ'লreversed ফাংশনটি ব্যবহার করা ।

dict(map(reversed, my_dict.items()))

সংক্ষেপে, আপনার অভিধানটি (ব্যবহার করে .items()) এর মাধ্যমে পুনরাবৃত্তি করা হবে যেখানে প্রতিটি আইটেম একটি কী / মান জোড় হয় এবং সেই আইটেমগুলি reversedফাংশনটির সাথে অদলবদল হয় । এটি যখন dictকনস্ট্রাক্টরের কাছে পৌঁছে দেওয়া হয় , এটি তাদের মান / কী জোড়গুলিতে পরিণত করে যা আপনি চান।


6

জাভিয়ের উত্তরের জন্য উন্নতির পরামর্শ:

dict(zip(d.values(),d))

পরিবর্তে d.keys()আপনি কেবল লিখতে পারেন d, কারণ যদি আপনি একটি পুনরুক্তিকারীর সাথে অভিধানের মাধ্যমে যান তবে এটি প্রাসঙ্গিক অভিধানের কীগুলি ফিরিয়ে দেবে।

প্রাক্তন এই আচরণের জন্য:

d = {'a':1,'b':2}
for k in d:
 k
'a'
'b'


2
dict(map(lambda x: x[::-1], YourDict.items()))

.items()এর tuples একটি তালিকা প্রদান করে (key, value)map()তালিকার উপাদানগুলির মধ্য দিয়ে যায় এবং lambda x:[::-1]একে বিপরীত করতে প্রতিটিটির উপাদান (টিপল) এর উপরে প্রয়োগ হয়, সুতরাং প্রতিটি টিপল (value, key)ম্যাপের বাইরে থুতু নতুন তালিকায় পরিণত হয়। অবশেষে, dict()নতুন তালিকা থেকে একটি ডিক তৈরি করে।


.items () টিপলগুলির একটি তালিকা (কী, মান) প্রদান করে। মানচিত্র () তালিকার উপাদানগুলির মধ্য দিয়ে যায় এবং lambda x:[::-1]একে বিপরীত করতে প্রতিটিটির উপাদানগুলিকে (টিপল) প্রয়োগ করে, তাই প্রতিটি টিপল মানচিত্রের বাইরে ছিটানো নতুন তালিকার (মান, কী) হয়ে যায়। অবশেষে, ডিক () নতুন তালিকা থেকে একটি ডিক তৈরি করে।
ইলিয়া প্রকিন

1

লুপ ব্যবহার :

newdict = {} #Will contain reversed key:value pairs.

for key, value in zip(my_dict.keys(), my_dict.values()):
    # Operations on key/value can also be performed.
    newdict[value] = key


1

একটি ইন-প্লেস সমাধান যুক্ত করা হচ্ছে:

>>> d = {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> for k in list(d.keys()):
...     d[d.pop(k)] = k
... 
>>> d
{'two': 2, 'one': 1, 'four': 4, 'three': 3}

পাইথন 3-তে, আপনি ব্যবহার করা সমালোচনাযোগ্য list(d.keys())কারণ কীগুলির dict.keysএকটি দর্শন ফিরিয়ে দেয়। আপনি যদি পাইথন 2 ব্যবহার করেন d.keys()তবে যথেষ্ট।


1

হানানের উত্তর সঠিক কারণ এটি আরও সাধারণ ক্ষেত্রে কভার করে (অন্য উত্তরগুলি সদৃশ পরিস্থিতি সম্পর্কে অজ্ঞাতসারে কারও জন্য বিভ্রান্তিকর)। হানানের উত্তরের একটি উন্নতি সেটডিফল্ট ব্যবহার করছে:

mydict = {1:a, 2:a, 3:b}   
result = {}
for i in mydict:  
   result.setdefault(mydict[i],[]).append(i)
print(result)
>>> result = {a:[1,2], b:[3]}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.