পাইথন-এর তালিকা হিসাবে অভিধান কীগুলি কীভাবে ফিরবেন?


777

ইন পাইথন 2.7 , আমি অভিধান পেতে পারে কি , মান , বা আইটেম একটি তালিকা হিসাবে:

>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]

এখন, পাইথন> = 3.3 এ , আমি এই জাতীয় কিছু পেয়েছি:

>>> newdict.keys()
dict_keys([1, 2, 3])

সুতরাং, একটি তালিকা পেতে আমাকে এটি করতে হবে:

newlist = list()
for i in newdict.keys():
    newlist.append(i)

আমি ভাবছি, পাইথন 3- এ কোনও তালিকা ফেরত দেওয়ার আরও ভাল উপায় কি?


এই বিষয় সম্পর্কিত আকর্ষণীয় থ্রেড সুরক্ষা ইস্যু এখানে: blog.labix.org/2008/06/27/…
পল

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

উত্তর:


974

ব্যবহার করে দেখুন list(newdict.keys())

এটি dict_keysবস্তুকে একটি তালিকায় রূপান্তর করবে ।

অন্যদিকে, আপনার নিজের উচিত এটি গুরুত্বপূর্ণ কিনা তা জিজ্ঞাসা করা উচিত। কোডটির পাইথোনিক উপায় হ'ল হাঁসের টাইপিং ধরে নেওয়া ( যদি এটি হাঁসের মতো দেখতে লাগে এবং এটি হাঁসের মতো কোঁকড়ে থাকে তবে এটি একটি হাঁস )। dict_keysবস্তুর সবচেয়ে উদ্দেশ্যে একটি তালিকা মত কাজ করবে। এই ক্ষেত্রে:

for key in newdict.keys():
  print(key)

স্পষ্টতই, সন্নিবেশ অপারেটরগুলি কাজ নাও করতে পারে, তবে যাইহোক ডিকশনারি কীগুলির তালিকার পক্ষে এটি তেমন কোনও অর্থ দেয় না।


49
newdict.keys () ইনডেক্সিং সমর্থন করে না
জিপেটাস

57
list(newdict)এছাড়াও কাজ করে (কমপক্ষে অজগর 3.4 এ)। .keys()পদ্ধতিটি ব্যবহার করার কোনও কারণ আছে কি ?
naught101

46
দ্রষ্টব্য: ডিবাগারে pdb> list(newdict.keys()) ব্যর্থ হয় কারণ এটি একই নামের পিডিবির আদেশের সাথে সংঘর্ষ হয়। pdb> !list(newdict.keys())Pdb কমান্ডগুলি এড়ানোর জন্য ব্যবহার করুন ।
রিয়াজ রিজভী

23
@ naught101 হ্যাঁ, .keys()কী চলছে সে সম্পর্কে এটি আরও পরিষ্কার।
ফেলিক্স ডি।

2
মনে রাখবেন যে আপনি যদি তালিকা (newdict.keys ()) ব্যবহার করেন তবে কীগুলি হ্যাশিং অর্ডারের কারণে আপনি যে ক্রমগুলি রেখেছিলেন সেটিতে নেই!
ন্যাট এম

274

পাইথন> = 3.5 বিকল্প: আক্ষরিক তালিকায় আনপ্যাক করুন [*newdict]

পাইথন 3.5 এর সাথে নতুন আনপ্যাকিং জেনারালাইজেশন (পিইপি 448) প্রবর্তিত হয়েছিল যা আপনাকে এখন সহজেই করতে দেয়:

>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]

পুনরাবৃত্তিযোগ্য যে কোনও বস্তুর সাথে *কাজগুলি আনপ্যাক করা এবং যেহেতু অভিধানগুলি পুনরাবৃত্তি করার সময় তাদের কীগুলি ফিরিয়ে দেয়, আপনি সহজেই তালিকার ভিতরে এটি ব্যবহার করে একটি তালিকা তৈরি করতে পারেন।

.keys()অর্থাত্ যোগ করা [*newdict.keys()]আপনার উদ্দেশ্যকে আরও স্পষ্ট করে তুলতে সহায়তা করতে পারে যদিও এটির জন্য আপনাকে একটি ফাংশন চেহারা এবং অনুরোধ করতে হবে। (যা সত্য, সত্যই উদ্বিগ্ন হওয়া উচিত নয় )।

*iterableসিনট্যাক্স করছেন অনুরূপ list(iterable)বৈশিষ্ট্য ও আচরণ প্রাথমিকভাবে মধ্যে নথিভুক্ত করা হয় কল অধ্যায় পাইথন সহায়িকা করুন। পিইপি 448 দিয়ে যেখানে *iterableউপস্থিত হতে পারে তার উপর নিষেধাজ্ঞা শিথিল করা হয়েছিল যাতে এটি তালিকা, সেট এবং টুপল লিটারালগুলিতেও স্থাপন করা যায়, এক্সপ্রেশন তালিকাগুলির রেফারেন্স ম্যানুয়ালও এটি আপডেট করতে আপডেট করা হয়েছিল।


যদিও list(newdict)এটি দ্রুততর (কমপক্ষে ছোট অভিধানের জন্য) পার্থক্যের সাথে সমান কারণ কোনও ফাংশন কল আসলেই সম্পাদিত হয় না:

%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop

%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop

%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop

বৃহত্তর অভিধান সহ গতিটি প্রায় একই রকম (একটি বৃহত সংগ্রহের মাধ্যমে পুনরাবৃত্তির ওভারহেড একটি ফাংশন কলের স্বল্প ব্যয়কে ট্রাম্প করে)।


অনুরূপ ফ্যাশনে, আপনি অভিধান কীগুলির টিপল এবং সেট তৈরি করতে পারেন:

>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}

টিউপল মামলায় চলমান কমা থেকে সাবধান!


দুর্দান্ত ব্যাখ্যা, তবে দয়া করে আপনি এমন কোনও লিঙ্ক উল্লেখ করতে পারেন যা এই "* নিউডিক্টিক্ট" সিনট্যাক্সের ধরণের বর্ণনা দেয়, আমি বোঝাতে চাইছি কীভাবে এবং কেন এটি বোঝার জন্য অভিধান থেকে কীগুলি ফিরে আসে han থ্যাঙ্কস
মুহাম্মদ ইউনুস

1
@ মিউনাস সেই সিনট্যাক্সটি পাইথন ২ তেও বেশ কিছু সময়ের জন্য উপলব্ধ ছিল। ফাংশন কলগুলিতে আপনি ফলাফলটি মুদ্রিত হওয়ার def foo(*args): print(args)পরে অনুসরণ করতে পারেন । এই আচরণটি রেফারেন্স ম্যানুয়ালটির কল বিভাগে নির্দিষ্ট করা হয়েছে । পিইপি 448 সহ পাইথন 3.5 কেবলমাত্র যেখানে এইগুলি এখন ব্যবহারের অনুমতি দেয় তা প্রদর্শিত হতে পারে তার উপর বিধিনিষেধকে শিথিল করে । যেভাবেই হোক, আমি আমার উত্তরটি সম্পাদনা করব এবং এগুলি অন্তর্ভুক্ত করব। foo(*{1:0, 2:0})(1, 2)[*{1:0, 2:0}]
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড

1
*newdict- কোড গল্ফারদের পক্ষে এটি অবশ্যই উত্তর; পি। এছাড়াও: যা, সমস্ত সত্যতাতে, এমন কিছু নয় যা আপনার সম্পর্কে সত্যই উদ্বিগ্ন হওয়া উচিত - এবং আপনি যদি হন তবে অজগরটি ব্যবহার করবেন না
আর্টেমিস এখনও

46

list(newdict)পাইথন 2 এবং পাইথন 3 উভয়টিতে কাজ করে, কীগুলির একটি সহজ তালিকা সরবরাহ করে newdictkeys()প্রয়োজনীয় নয় (:


26

"হাঁসের টাইপিং" সংজ্ঞাটি কিছুটা বন্ধ - dict.keys() কোনও পুনরাবৃত্তযোগ্য অবজেক্ট ফিরিয়ে দেয়, তালিকার মতো বস্তু নয়। এটি যে কোনও জায়গায় কাজ করবে যেখানে কোনও পুনরাবৃত্তিযোগ্য কাজ করবে - তালিকার কোনও জায়গাই নয়। একটি তালিকাও পুনরাবৃত্তিযোগ্য, তবে একটি পুনরাবৃত্তযোগ্য একটি তালিকা নয় (বা ক্রম ...)

প্রকৃত ব্যবহারের ক্ষেত্রে, ডিকের কীগুলির সাথে সর্বাধিক সাধারণ কাজটি হল তাদের মাধ্যমে পুনরাবৃত্তি করা, সুতরাং এটি উপলব্ধি করে sense এবং যদি আপনার তালিকার মতো প্রয়োজন হয় তবে আপনি কল করতে পারেন list()

খুব অনুরূপভাবে zip()- এর বেশিরভাগ ক্ষেত্রে এটি পুনরাবৃত্তি হয় - কেন কেবলমাত্র এটির মাধ্যমে পুনরাবৃত্তি করার জন্য টিউপসগুলির একটি সম্পূর্ণ নতুন তালিকা তৈরি করা হয় এবং তারপরে এটি আবার ফেলে দেওয়া হয়?

এটি পুরো জায়গা জুড়ে তালিকার অনুলিপিগুলির চেয়ে আরও বেশি পুনরাবৃত্তকারী (এবং জেনারেটর) ব্যবহার করার জন্য অজগরটিতে এটি একটি বৃহৎ প্রবণতার অংশ।

dict.keys() যদিও বোঝার সাথে কাজ করা উচিত - টাইপস বা অন্য কিছুর জন্য সাবধানতার সাথে পরীক্ষা করুন ... এটি আমার পক্ষে ভাল কাজ করে:

>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]

2
এমনকি আপনি ব্যবহার করার প্রয়োজন নেই .keys(); অভিধান অবজেক্ট নিজেই iterable এবং কী উৎপন্ন করেন ওভার iterated: [key.split(", ") for key in d]
মার্টিজন পিটারস

25

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

>>> newdict = {1:0, 2:0, 3:0}
>>> [k  for  k in  newdict.keys()]
[1, 2, 3]

বা, আরও কম,

>>> [k  for  k in  newdict]
[1, 2, 3]

দ্রষ্টব্য: 3.7 এর অধীনে সংস্করণগুলিতে অর্ডারটির গ্যারান্টি নেই (ক্রমটি এখনও সিপিথন 3.6 সহ কেবল একটি বাস্তবায়ন বিশদ)।


6
শুধু ব্যবহার list(newdict)। এখানে তালিকা বোধের প্রয়োজন নেই।
মার্টিজন পিটারস

8

keysপদ্ধতিটি ব্যবহার না করে একটি তালিকায় রূপান্তরকরণ এটি আরও পঠনযোগ্য করে তোলে:

list(newdict)

এবং অভিধানে লুপ করার সময়, এর জন্য কোনও প্রয়োজন নেই keys():

for key in newdict:
    print key

আপনি যদি এটিকে লুপের মধ্যে পরিবর্তন না করেন যার জন্য কীগুলির তালিকা তৈরি করা দরকার যা আগেই তৈরি হয়েছিল:

for key in list(newdict):
    del newdict[key]

পাইথন 2 এ ব্যবহার করে একটি প্রান্তিক পারফরম্যান্স লাভ রয়েছেkeys()


8

যদি আপনার কীগুলি আলাদাভাবে সঞ্চয় করতে হয়, তবে এখানে একটি সমাধান রয়েছে যা এক্সটেন্ডেড আইটেবল আনপ্যাকিং (পাইথন 3.x +) ব্যবহার করে এখন পর্যন্ত উপস্থাপিত প্রতিটি সমাধানের চেয়ে কম টাইপিংয়ের প্রয়োজন ।

newdict = {1: 0, 2: 0, 3: 0}
*k, = newdict

k
# [1, 2, 3]

            ╒═══════════════╤═════════════════════════════════════════╕
             k = list(d)      9 characters (excluding whitespace)   
            ├───────────────┼─────────────────────────────────────────┤
             k = [*d]         6 characters                          
            ├───────────────┼─────────────────────────────────────────┤
             *k, = d          5 characters                          
            ╘═══════════════╧═════════════════════════════════════════╛

1
আমি যে ছোটখাটো সাবধানতাটি উল্লেখ করতে পারি তা হ'ল kএখানে সর্বদা একটি তালিকা। কোনও ব্যবহারকারী যদি টিপল বা চাবিগুলি থেকে সেট করতে চান তবে তাদের অন্য বিকল্পগুলিতে ফিরে যেতে হবে।
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড

1
আরও লক্ষণীয় নোটটি হ'ল একটি বিবৃতি হিসাবে, *k, = dযেখানে এটি উপস্থিত হতে পারে তার সীমাবদ্ধতা রয়েছে (তবে দেখুন, এবং সম্ভবত এই উত্তরটি পিইপি 572 আপডেট করুন - এক্সটেন্ডেড আনপ্যাকিং অ্যাসাইনমেন্ট এক্সপ্রেশনস এটিএম এর জন্য সমর্থিত নয় তবে এটি কোনও দিন হতে পারে! )
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড

আপনি যদি কী এবং মান উভয় তালিকার চান তবে?
এন্ডোলিথ

1
@ এন্ডোলিথ সম্ভবত keys, vals = zip(*d.items())(যদিও এটি দুটি টিপল দেয়, যথেষ্ট কাছে)। আমি এর চেয়ে কম সংক্ষেপে প্রকাশ জানি না।
cs95

1

আমি 2 টি উপায় নিয়ে ভাবতে পারি যার মাধ্যমে আমরা অভিধান থেকে কীগুলি বের করতে পারি।

পদ্ধতি 1: - .keys () পদ্ধতিটি ব্যবহার করে কীগুলি পান এবং তারপরে এটি তালিকাতে রূপান্তর করুন।

some_dict = {1: 'one', 2: 'two', 3: 'three'}
list_of_keys = list(some_dict.keys())
print(list_of_keys)
-->[1,2,3]

পদ্ধতি 2: - একটি ফাঁকা তালিকা তৈরি করতে এবং তারপরে একটি লুপের মাধ্যমে তালিকায় কী যুক্ত করুন। আপনি এই লুপের সাহায্যে মানগুলিও পেতে পারেন (কেবল কীগুলির জন্য .keys () এবং .items () কী এবং মান উভয়ের জন্য)

list_of_keys = []
list_of_values = []
for key,val in some_dict.items():
    list_of_keys.append(key)
    list_of_values.append(val)

print(list_of_keys)
-->[1,2,3]

print(list_of_values)
-->['one','two','three']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.