আপনি অভিধানে প্রথম কীটি কীভাবে খুঁজে পাবেন?


199

আমি চেষ্টা করছি আমার প্রোগ্রামটি "banana"অভিধান থেকে মুদ্রণের জন্য । এটি করার সহজ উপায়টি কী হবে?

এটি আমার অভিধান:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}

35
পাইথনের অভিধানগুলি আনঅর্ডারড, সুতরাং কোনও "প্রথম কী" নেই। এখানে দেখুন
ডেভিড রবিনসন

2
আপনি কি আক্ষরিকভাবে "কলা" শব্দটি বা "কলা" এর সাথে যুক্ত মান (4, এই ক্ষেত্রে) মুদ্রণ করতে চান?
পল এইচ

to print out banana with a FOR loop, so when I run it, each key would also be printed outমানে for k in prices: print k? এটি অভিধানে সমস্ত কী মুদ্রণ করবে।
ডেভিড রবিনসন


7
পাইথন মধ্যে 3.6+ dictionariesare আদেশ (দেখুন: প্রথম মন্তব্যের stackoverflow.com/questions/39980323/... )
Egirus Ornila

উত্তর:


283

পাইথন সংস্করণে যেখানে ডিক্টস আসলে অর্ডার করা হয় আপনি তা করতে পারেন

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

ডিক্টস অর্ডার করার জন্য আপনার পাইথন ৩.7+ বা 3.6+ প্রয়োজন যদি আপনি পাইথন ৩.6-তে প্রযুক্তিগত-প্রয়োগ-বিশদ আদেশের ডিক্টের প্রকৃতির উপর নির্ভর করে ঠিক থাকেন।

পূর্ববর্তী পাইথন সংস্করণগুলির জন্য, কোনও "প্রথম কী" নেই।


29
যদি আপনি পাইথন 3 তে কী এবং মান উভয়ই চান:next(iter( my_dict.items() ))
জোনাথন এইচ

@ রায়ানহাইনিং পাইথন ডিক্টস সিপিথন ৩.6 এবং অন্য যে কোনও পাইথন বাস্তবায়ন পাইথন ৩.7 দিয়ে শুরু করে সন্নিবেশ দ্বারা অর্ডার করা হয়
বোরিস

1
এই উত্তরটি আমার ডিবাগিং সেশনটিকে বিভ্রান্ত করেছে যে আমি ব্রেকপয়েন্টে যেতে 6 ঘন্টা অপেক্ষা করেছি। এটি খুব ভেক্সিকিং।
মাইকেল

127

একটি অভিধান সূচিকৃত নয়, তবে এটি কোনও উপায়ে অর্ডার করা হয়েছে। নিম্নলিখিতটি আপনাকে প্রথম বিদ্যমান কী প্রদান করবে:

list(my_dict.keys())[0]

24
এটি কী রাখা সহজ নয় list(my_dict)[0]যেহেতু এটি কীগুলির তালিকাটি পুনরুদ্ধার করবে?
জিন-ফ্রাঙ্কোইস টি।

@ জাঁ ফ্রাংকো। হ্যাঁ
রায়ান হেইনিং

পাইথন ৩.6-তে এবং অন্যান্য সমস্ত পাইথন বাস্তবায়নের জন্য পাইথন ৩.7 দিয়ে আর্টিকেশনগুলি অর্ডার করা হয়েছে
বোরিস

51

আপডেট: পাইথন ৩.7 হিসাবে সন্নিবেশ ক্রম বজায় রাখা হয়, সুতরাং আপনার OrderedDictএখানে কোনও দরকার নেই। আপনি সাধারণের সাথে নীচের পদ্ধতিগুলি ব্যবহার করতে পারেনdict

সংস্করণ 3.7 এ পরিবর্তিত হয়েছে: অভিধান ক্রম সন্নিবেশ ক্রমের গ্যারান্টিযুক্ত। এই আচরণটি সিপিথনের একটি বাস্তবায়ন বিবরণ ছিল 3.6 থেকে।

উৎস


পাইথন ৩.6 এবং তার আগের *

আপনি যদি নিয়মিত কথা বলছেন dictতবে "প্রথম কী" এর অর্থ কিছু নেই। কীগুলি কোনওভাবেই আপনি নির্ভর করতে পারেন যাতে অর্ডার করা হয় না। আপনি নিজের উপর পুনরাবৃত্তি যদি আপনি dictসম্ভবত "banana"প্রথম জিনিস হিসাবে পাবেন না ।

আপনার যদি জিনিসগুলিকে যথাযথভাবে রাখতে হয় তবে আপনাকে OrderedDictকেবল একটি সরল অভিধান ব্যবহার করতে হবে না।

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

এরপরে আপনি যদি সমস্ত কীগুলি ক্রম দেখতে চান তবে এর মাধ্যমে পুনরাবৃত্তি করে আপনি এটি করতে পারেন

for k in prices:
    print(k)

আপনি বিকল্পভাবে সমস্ত কীগুলি একটি তালিকায় রাখতে পারেন এবং তারপরে এটি দিয়ে কাজ করতে পারেন

ks = list(prices)
print(ks[0]) # will print "banana"

তালিকা তৈরি না করেই প্রথম উপাদানটি পাওয়ার দ্রুততম উপায় nextহল পুনরুক্তিকারীকে কল করা। nthযদিও উপাদানটি পাওয়ার চেষ্টা করার সময় এটি সাধারণভাবে কার্যকর হয় না

>>> next(iter(prices))
'banana'

* সিপিথন 3..6-এ প্রয়োগের বিশদ হিসাবে সন্নিবেশ আদেশের গ্যারান্টিযুক্ত ছিল।


পরামর্শের জন্য ধন্যবাদ. আমি আরও স্পষ্ট না হওয়ার জন্য দুঃখিত। আমি কেবল কোডটি সন্ধান করার চেষ্টা করছি যা আমাকে "কলা" মুদ্রণ করতে দেবে এর সাথে সম্পর্কিত মানটি নয়। সমস্ত ইনপুট জন্য ধন্যবাদ!
স্লাগয়

31

পাইথন 3 এর জন্য নীচে রূপান্তরটির ওভারহেড সরিয়ে দেয়:

first = next(iter(prices.values()))

10

dictটাইপ একটি হল unordered ম্যাপিং, তাই একটি "প্রথম" উপাদান যেমন জিনিস আছে।

কি চাও সম্ভবত collections.OrderedDict


বা একটি নেমটুপল সম্ভবত এটি অপরিবর্তনীয়
জোড়ান বিসলে

এটি পাইথন ৩.6 হিসাবে পরিবর্তিত হয়েছে। অভিধান এখন অর্ডার করা হয়।
মিসানট্রুপ

1
ভাল প্রযুক্তিগতভাবে, আপনি অভিধান কীগুলির প্রথম উপাদানটি চান যদি আপনি নিশ্চিত হন তবে কেবল একটি কী আছে।
DBX12

কেউ ডিক্সের উপর পুনরাবৃত্তি করার সময় প্রথম আইটেমটি বলতে পারে যা ifs স্থির করে। তবে সৌভাগ্য যে এক খুঁজে।
ডেমোঙ্গোলেম

6

সুতরাং আমি এই পৃষ্ঠাটি খুঁজে পেয়েছিলাম পরিচিত দৈর্ঘ্যের 1 অভিধানে একটিমাত্র কী নেওয়ার জন্য এবং কেবল কীটি ফেরত দেওয়ার জন্য কোনও জিনিসটি অনুকূল করার চেষ্টা করার সময়। নীচের প্রক্রিয়াটি আমি প্রায় 700 আকার পর্যন্ত চেষ্টা করেছি এমন সমস্ত অভিধানের জন্য দ্রুততম ছিল।

আমি 7 টি পৃথক পদ্ধতির চেষ্টা করে দেখেছি যে পাইথন 3.6 সহ আমার 2014 ম্যাকবুকটিতে এটি সবচেয়ে ভাল ছিল:

def first_5():
    for key in biased_dict:
        return key

তাদের প্রোফাইল দেওয়ার ফলাফল ছিল:

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

আমি চেষ্টা করেছি সমস্ত পদ্ধতির এখানে:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key

1
সুতরাং লুপের জন্য একটি করণ এবং প্রথম কী (প্রথম_5) ফিরিয়ে দেওয়া আসলে আমি দেখতে পাচ্ছি তত দ্রুত? এছাড়াও বিভিন্ন পদ্ধতির একটি দুর্দান্ত তুলনা।
পাইম্যাথলিঙ্গেজয়েজ

1
হ্যাঁ, এবং কেবল দ্রুত নয়, একটি দেশের মাইল থেকে দ্রুত। পড়ার পক্ষে সবচেয়ে সহজ, স্বাচ্ছন্দ্যে।
turyag

4

সহজ হিসাবে সহজ, আমার মতে উত্তর হবে

first = list(prices)[0]

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


পাইথন 3 এর জন্য কেবলমাত্র তার প্রথম উপাদানটি পুনরুদ্ধার করার জন্য একটি সম্পূর্ণ নতুন তালিকা তৈরি করার দরকার নেই। next(iter(prices))ইতিমধ্যে অন্যান্য উত্তরের পরামর্শ হিসাবে আরও ভাল ব্যবহার ।
নরম্যানিয়াস

1

অন্য অনেকে যেমন উল্লেখ করেছেন যে কোনও অভিধানে প্রথম মান নেই। এগুলিতে বাছাই করা নির্বিচারে এবং আপনি যখনই অভিধানে অ্যাক্সেস করেন ততবার আপনি বাছাই করা একইরূপে নির্ভর করতে পারবেন না। তবে আপনি যদি সেখানে কীগুলি মুদ্রণ করতে চান তবে কয়েকটি উপায়:

for key, value in prices.items():
    print(key)

এই পদ্ধতিটি কী এবং মানটি অ্যাক্সেস করার জন্য টুপল অ্যাসাইনমেন্ট ব্যবহার করে। যদি আপনার কোনও কারণে কী এবং মান উভয়ই অ্যাক্সেস করতে হয় তবে এই সহজ।

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

এটি keys()পদ্ধতি অনুসারে কেবল কীগুলিতে অ্যাক্সেস দেয় ।


1

d.keys () [0] স্বতন্ত্র কী পেতে।

আপডেট: - @ আলেজোবার্নার্ডিন, আপনি কেন এটি কাজ করেন নি বলে নিশ্চিত নন। এখানে আমি পরীক্ষা করেছিলাম এবং এটি কাজ করে। সংগ্রহ আমদানি

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'কলার'


ভোটের সংখ্যার দিকে তাকিয়ে, কেন এটি সেরা ভাল সমাধান নয়?
গুসুকু

18
এটি পাইথন 2 তে কাজ করে তবে পাইথন 3 তে নয়। পাইথন 3 এ, এর পরিবর্তে dict.keys()একটি ফেরত দেয় যা সূচকে সমর্থন করে না। 'dict_keys' objectlist
ম্যাভিক্স

প্রকারের ত্রুটি: 'ডিক্ট_কিজ' অবজেক্ট ইনডেক্সিং সমর্থন করে না
anilbey

0

লুপের জন্য এমন কোনও ব্যবহার করুন যা এতে সমস্ত কী ব্যবহার করে prices:

for key, value in prices.items():
     print key
     print "price: %s" %value

নিশ্চিত করুন যে আপনি পরিবর্তন করতে prices.items()করতে prices.iteritems()আপনি পাইথন 2.x ব্যবহার করছেন


0

যদি আপনি কেবল অভিধান থেকে প্রথম কীটি চান তবে আপনার আগে অনেকে যা পরামর্শ দিয়েছেন তা ব্যবহার করা উচিত

first = next(iter(prices))

তবে আপনি যদি প্রথমটি চান এবং বাকিটিকে তালিকা হিসাবে রাখেন তবে আপনি মানগুলি আনপ্যাকিং অপারেটরটি ব্যবহার করতে পারেন

first, *rest = prices

কী এবং মান উভয়কে প্রতিস্থাপনের pricesমাধ্যমে prices.values()এবং এমনকি আনপ্যাকিং অ্যাসাইনমেন্ট ব্যবহার করতে পারেন উভয়ের জন্য মানগুলির ক্ষেত্রে এটি একই প্রযোজ্য

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

দ্রষ্টব্য: আপনি first, *_ = pricesকেবল প্রথম কীটি ব্যবহার করার জন্য প্রলুব্ধ হতে পারেন , তবে আমি সাধারণত এই ব্যবহারের বিরুদ্ধে পরামর্শ দেব যদি না অভিধান খুব ছোট হয় যেহেতু এটি সমস্ত কীগুলিতে লুপ করে এবং এর জন্য একটি তালিকা তৈরি না করে restকিছু ওভারহেড থাকে।

দ্রষ্টব্য: অন্যদের দ্বারা উল্লিখিত আদেশ সজ্জাটি পাইথন ৩.7 (বা প্রযুক্তিগতভাবে ৩.6) এবং তারপরে সংরক্ষণ করা হয়েছে যদিও পূর্ববর্তী বাস্তবায়নগুলি অপরিজ্ঞাত অর্ডার হিসাবে বিবেচনা করা উচিত।


-3

সবচেয়ে সহজ উপায়:

first_key = my_dict.keys()[0]

তবে কিছু সময় আপনার আরও যত্নবান হওয়া উচিত এবং আশ্বাস দেওয়া উচিত যে আপনার সত্তা একটি মূল্যবান তালিকা তাই:

first_key = list(my_dict.keys())[0]

3
এটি উত্থাপিত হয় TypeError: 'dict_keys' object is not subscriptable, কমপক্ষে পাইথন ৩.৮-এর সাথে
এরিক সোভেন পিউডিস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.