নামকরণকে একটি অভিধানে রূপান্তর করুন


147

পাইথনে আমার একটি নামকৃত টিপল ক্লাস রয়েছে

class Town(collections.namedtuple('Town', [
    'name', 
    'population',
    'coordinates',
    'population', 
    'capital', 
    'state_bird'])):
    # ...

আমি টাউন দৃষ্টান্তগুলি অভিধানে রূপান্তর করতে চাই। আমি চাই না যে এটি কোনও টাউনের ক্ষেত্রের নাম বা সংখ্যার সাথে কঠোরভাবে বেঁধে দেওয়া হোক।

এটি লেখার জন্য কি এমন কোনও উপায় আছে যে আমি আরও ক্ষেত্র যুক্ত করতে পারি, বা একটি সম্পূর্ণ ভিন্ন নামের টিপলটি পাস করতে পারি এবং একটি অভিধান পেতে পারি।

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


2
বিটিডব্লিউ ... ট্যাব সমাপ্তি বা dirকমান্ডটি দেখুন, যা আপনাকে যে কোনও অবজেক্টের ক্ষেত্র প্রদর্শন করবে ... যা _asdictসরাসরি ফাংশনটি দেখাত।
করলি ব্রিগম্যান

দেখে মনে হচ্ছে কি তোমার মত সত্যিই কাজ করতে চান থেকে উপশ্রেণী হয় dict'namedtuple' এর পরিবর্তে, এবং সূচনাকারী মধ্যে namedtuple পাস। মনে রাখবেন যে আপনি যদি সিএক্সএক্সে অভ্যস্ত হন তবে নির্ধারক class Town(x)নয়, def __init__(self, *args, **kwargs)এটির ভিতরে।
করলি ব্রিগম্যান

আমি কারও এলিস কোডে আসল ক্লাসটি পরিবর্তন করতে পারি না। সুতরাং আমাকে নামফলক থেকে সাবক্লাস করতে হবে
মি মি ইট জাস্ট আউসো

@ করলিব্রিগম্যান আপনি কি আরও এটি ব্যাখ্যা করতে পারেন? আমি নাম্বারযুক্ত ট্রিপলে ডকুমেন্টেশনগুলি সন্ধান করার চেষ্টা করেছি, বা এটিতে আমি কী কল করতে পারি তা খুঁজে পেতে পারি এবং কীভাবে তা বুঝতে পারি না। (আবার পাইথন আমার শক্তিশালী ভাষা নয়)
আমাকে ছাড়া এটি জাস্ট আয়েসো

2
কোন অংশ? dirএটি কেবল একটি পাইথন অন্তর্নির্মিত ... আপনি এটি কোনও অজগর অবজেক্ট, কনসোলে বা স্ক্রিপ্টে চালাতে পারেন (যেখানে এটি একটি তালিকা প্রত্যাবর্তন করে যা আপনি মুদ্রণ করতে পারেন বা যা কিছু করতে পারেন), এবং এটি একটি তালিকা ফিরে আসবে (প্রায় ) সমস্ত বৈশিষ্ট্য অবজেক্ট। আপনি যদি কোনও অজানা বিষয় কীভাবে কাজ করে তা নির্ধারণের চেষ্টা করছেন তবে সহায়ক।
করলি ব্রিগম্যান

উত্তর:


267

টিএল; ডিআর: এর জন্য একটি পদ্ধতি _asdictসরবরাহ করা আছে।

এখানে ব্যবহারের একটি প্রদর্শন রয়েছে:

>>> fields = ['name', 'population', 'coordinates', 'capital', 'state_bird']
>>> Town = collections.namedtuple('Town', fields)
>>> funkytown = Town('funky', 300, 'somewhere', 'lipps', 'chicken')
>>> funkytown._asdict()
OrderedDict([('name', 'funky'),
             ('population', 300),
             ('coordinates', 'somewhere'),
             ('capital', 'lipps'),
             ('state_bird', 'chicken')])

এটি নেমটুপলসের একটি নথিভুক্ত পদ্ধতি , অর্থাত পাইথনের সাধারণ কনভেনশন থেকে ভিন্ন পদ্ধতিটির নামটির শীর্ষস্থানীয় আন্ডারস্কোরটি ব্যবহারকে নিরুৎসাহিত করার পক্ষে নেই । অন্যান্য পদ্ধতি namedtuples যোগ করা সাথে _make, _replace, _source, _fields, এটা আন্ডারস্কোর শুধুমাত্র চেষ্টা করুন এবং সম্ভব ফিল্ডের নাম সাথে সঙ্ঘাত প্রতিরোধ করতে হবে।


দ্রষ্টব্য: বুনোতে কিছু 2.7.5 <অজগর সংস্করণ <3.5.0 কোডের জন্য, আপনি এই সংস্করণটি দেখতে পাবেন:

>>> vars(funkytown)
OrderedDict([('name', 'funky'),
             ('population', 300),
             ('coordinates', 'somewhere'),
             ('capital', 'lipps'),
             ('state_bird', 'chicken')])

কিছুক্ষণের জন্য ডকুমেন্টেশনে উল্লেখ করা _asdictহয়েছিল যে এটি অপ্রচলিত ( এখানে দেখুন ), এবং বিল্ট-ইন পদ্ধতিটির ভারগুলি ব্যবহার করার পরামর্শ দিয়েছিল । সেই পরামর্শ এখন পুরানো; সাবক্লাসিং সম্পর্কিত কোনও ত্রুটি সংশোধন করার জন্য , __dict__নামটুপলসে উপস্থিত সম্পত্তি আবার এই প্রতিশ্রুতি দ্বারা সরানো হয়েছে ।


1
কেউ কি জানেন যে যদি এমন কোনও প্রতিষ্ঠিত নজির আছে যা প্রস্তাব দেয় যে _asdictস্ট্যান্ডার্ড লাইব্রেরিতে বিকল্পযুক্ত না করা উচিত asdict?
কোবেজহান

1
@ কোবেজহান তখন আপনি "asdict"একটি অন্যতম প্রধান নাম হতে পারবেন না ।
শ্যাডট্যালকার

28

এর namedtupleউদাহরণগুলির জন্য একটি অন্তর্নির্মিত পদ্ধতি রয়েছে _asdict,।

মন্তব্যগুলিতে যেমন আলোচনা করা হয়েছে, কিছু সংস্করণে vars()এটিও করা হবে তবে এটি স্পষ্টতই বিল্ডের বিবরণগুলির উপর নির্ভরশীল, যেখানে _asdictনির্ভরযোগ্য হওয়া উচিত। কিছু সংস্করণে _asdictঅবচয় হিসাবে চিহ্নিত করা হয়েছিল, কিন্তু মন্তব্যগুলি ইঙ্গিত দেয় যে এটি আর 3.4 এর মতো হয় না।


1
আমি ডাউনভোটার ছিলাম না, তবে এটি হতে পারে কারণ _asdictপদ্ধতিটি পাইথন 3 (বার্সের পক্ষে) অবলম্বন
wim

বিপরীতে, দেখে মনে varsহচ্ছে এটি কিছু পুরানো সংস্করণে কাজ করে না - ২.7-তে এটি একটি উত্থাপন করে TypeError, যেহেতু সংস্করণটির namedtupleশ্রেণীর কোনও __dict__বৈশিষ্ট্য নেই।
পিটার DeGlopper

হ্যাঁ, মার্টিজন এবং আমি এখানে এটি নিয়ে আলোচনা করেছি । এটা তোলে BTW 2.7 এর নতুন সংস্করণে কাজ করবে (আমি 2.7.6 উপর আছি এবং এটি কাজ করে)
Wim

আমার উপরের মন্তব্যে সম্পাদনা উইন্ডোটি অতীত করুন - এটি 2.7.5 এ ব্যর্থ হয় তাই এটি অবশ্যই 2.7.6 হিসাবে নতুন হওয়া উচিত। আমার 2.7.5 বিল্ডটি বন্ধ না হলে মার্তিজানের লিঙ্কযুক্ত উত্তরে ছিল? যাইহোক, দেখে মনে হচ্ছে এটি বিল্ড স্পেসিফিকেশনের উপর নির্ভর করে 2.7.5 এ কাজ করে কিনা।
পিটার DeGlopper

8
কেবলমাত্র একটি মাথা আপ: _আসডিক্টটি এখন আর অবৈধ নয় (এবং এখন একটি অর্ডারডিক্ট রিটার্ন করে), এবং ওয়ারগুলি পাইথন ৩.৪ এর সাথে একটি ত্রুটি তৈরি করে ( নেমটিপলসের ডিক বৈশিষ্ট্য অপসারণ থেকে )।
আলেকজান্ডার হুজ্জাহ

2

উবুন্টুতে পাইথন 2.7 এবং পাইথন 3.4 এর এলটিএস সংস্করণ 14.04 __dict__সম্পত্তি প্রত্যাশার মতো কাজ করেছে। _asdict পদ্ধতি এছাড়াও কাজ, কিন্তু আমি স্থানীয় নন-ইউনিফর্ম API- এর পরিবর্তে মান-সংজ্ঞায়িত, অভিন্ন, সম্পত্তি API- টি ব্যবহার করার আনত করছি।

y পাইথন 2.7

# Works on:
# Python 2.7.6 (default, Jun 22 2015, 17:58:13)  [GCC 4.8.2] on linux2
# Python 3.4.3 (default, Oct 14 2015, 20:28:29)  [GCC 4.8.4] on linux

import collections

Color = collections.namedtuple('Color', ['r', 'g', 'b'])
red = Color(r=256, g=0, b=0)

# Access the namedtuple as a dict
print(red.__dict__['r'])  # 256

# Drop the namedtuple only keeping the dict
red = red.__dict__
print(red['r'])  #256

ডিক হিসাবে দেখা হ'ল শব্দকোষকে উপস্থাপন করে একটি অভিধান পাওয়ার অর্থপূর্ণ উপায়, (কমপক্ষে আমার জ্ঞানের সেরা দিক থেকে)।


বড় পাইথন সংস্করণ এবং প্ল্যাটফর্মগুলির একটি টেবিল এবং তাদের সমর্থনগুলির জন্য একটি টেবিল সংগ্রহ করা ভাল লাগবে __dict__, বর্তমানে আমার কেবল উপরে একটি পোস্ট প্ল্যাটফর্ম সংস্করণ এবং দুটি পাইথন সংস্করণ রয়েছে।

| Platform                      | PyVer     | __dict__ | _asdict |
| --------------------------    | --------- | -------- | ------- |
| Ubuntu 14.04 LTS              | Python2.7 | yes      | yes     |
| Ubuntu 14.04 LTS              | Python3.4 | yes      | yes     |
| CentOS Linux release 7.4.1708 | Python2.7 | no       | yes     |
| CentOS Linux release 7.4.1708 | Python3.4 | no       | yes     |
| CentOS Linux release 7.4.1708 | Python3.6 | no       | yes     |

1
Linux-3.10.0-693.el7.x86_64-x86_64-Centos-7.4.1708- কোর, পাইথন 2.7 - দিয়ে __dict__কাজ করে না।
gbtimmon

-1

কেস # 1: এক মাত্রার টিপল

TUPLE_ROLES = (
    (912,"Role 21"),
    (913,"Role 22"),
    (925,"Role 23"),
    (918,"Role 24"),
)


TUPLE_ROLES[912]  #==> Error because it is out of bounce. 
TUPLE_ROLES[  2]  #==> will show Role 23.
DICT1_ROLE = {k:v for k, v in TUPLE_ROLES }
DICT1_ROLE[925] # will display "Role 23" 

কেস # 2: দ্বিমাত্রিক
দ্বীনের উদাহরণ: DICT_ROLES [961] # 'ব্যাক-এন্ড প্রোগ্রামার' দেখাবে

NAMEDTUPLE_ROLES = (
    ('Company', ( 
            ( 111, 'Owner/CEO/President'), 
            ( 113, 'Manager'),
            ( 115, 'Receptionist'),
            ( 117, 'Marketer'),
            ( 119, 'Sales Person'),
            ( 121, 'Accountant'),
            ( 123, 'Director'),
            ( 125, 'Vice President'),
            ( 127, 'HR Specialist'),
            ( 141, 'System Operator'),
    )),
    ('Restaurant', ( 
            ( 211, 'Chef'), 
            ( 212, 'Waiter/Waitress'), 
    )),
    ('Oil Collector', ( 
            ( 211, 'Truck Driver'), 
            ( 213, 'Tank Installer'), 
            ( 217, 'Welder'),
            ( 218, 'In-house Handler'),
            ( 219, 'Dispatcher'),
    )),
    ('Information Technology', ( 
            ( 912, 'Server Administrator'),
            ( 914, 'Graphic Designer'),
            ( 916, 'Project Manager'),
            ( 918, 'Consultant'),
            ( 921, 'Business Logic Analyzer'),
            ( 923, 'Data Model Designer'),
            ( 951, 'Programmer'),
            ( 953, 'WEB Front-End Programmer'),
            ( 955, 'Android Programmer'),
            ( 957, 'iOS Programmer'),
            ( 961, 'Back-End Programmer'),
            ( 962, 'Fullstack Programmer'),
            ( 971, 'System Architect'),
    )),
)

#Thus, we need dictionary/set

T4 = {}
def main():
    for k, v in NAMEDTUPLE_ROLES:
        for k1, v1 in v:
            T4.update ( {k1:v1}  )
    print (T4[961]) # will display 'Back-End Programmer'
    # print (T4) # will display all list of dictionary

main()

-1

যদি _আরডিক্ট () না হয়, আপনি এইভাবে ব্যবহার করতে পারেন:

def to_dict(model):
    new_dict = {}
    keys = model._fields
    index = 0
    for key in keys:
        new_dict[key] = model[index]
        index += 1

    return new_dict

-5

পাইথন ৩. অভিধানের জন্য প্রয়োজনীয় সূচক হিসাবে যে কোনও ক্ষেত্রকে অভিধানে বরাদ্দ করুন, আমি 'নাম' ব্যবহার করেছি।

import collections

Town = collections.namedtuple("Town", "name population coordinates capital state_bird")

town_list = []

town_list.append(Town('Town 1', '10', '10.10', 'Capital 1', 'Turkey'))
town_list.append(Town('Town 2', '11', '11.11', 'Capital 2', 'Duck'))

town_dictionary = {t.name: t for t in town_list}

আপনি যেমন নাম জানেন তেমন সহায়ক নয়। এটি একটি অন্ধ পদ্ধতি হতে হবে
মিশেল ক্যারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.