एक शब्दकोश में एक नामांकित बदलें


148

अजगर में मेरा नाम टपल क्लास है

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

मैं शहर के उदाहरणों को शब्दकोशों में बदलना चाहता हूं। मैं नहीं चाहता कि यह किसी कस्बे के क्षेत्रों के नाम या संख्या से सख्ती से जुड़ा हो।

क्या ऐसा लिखने का कोई तरीका है जिससे मैं और अधिक फ़ील्ड जोड़ सकूँ, या एक पूरी तरह से अलग नाम की टपल पास कर सकूँ और एक शब्दकोश प्राप्त कर सकूँ।

मैं मूल वर्ग की परिभाषा को किसी और के कोड में बदल नहीं सकता। इसलिए मुझे एक टाउन का उदाहरण लेने की जरूरत है और इसे एक डिक्शनरी में बदलना है।


2
btw ... टैब पूरा होने या dirकमांड को देखें, जो आपको किसी भी ऑब्जेक्ट के लिए फ़ील्ड दिखाएगा ... जो _asdictसीधे फ़ंक्शन को दिखाएगा ।
Corley Brigman

ऐसा लगता है कि आप वास्तव में जो करना चाहते हैं, वह dict'नेमटुपल' के बजाय सबक्लास है, और आरम्भिक में नामांकित को पास करें। याद रखें कि यदि आप Cxx के लिए उपयोग किए जाते हैं, class Town(x)तो कंस्ट्रक्टर नहीं है, इसके def __init__(self, *args, **kwargs)अंदर है।
Corley Brigman

मैं मूल वर्ग में परिवर्तन नहीं कर सकता क्योंकि किसी में इसका कोड है। इसलिए मुझे नामांकित से
बिना मेरे यह सब बस

@CorleyBrigman आप इसे और अधिक समझा सकते हैं? मैंने नामित टूप्ले पर दस्तावेज़ीकरण खोजने की कोशिश की, या यह पाया कि मैं इस पर क्या कह सकता हूं और मैं यह पता नहीं लगा सका कि कैसे। (फिर से अजगर मेरी सबसे मजबूत भाषा नहीं है)
विदाउट मी इट जस्ट एवेसो

2
कोनसा भाग? dirसिर्फ एक अजगर में निर्मित है ... आप इसे किसी भी अजगर वस्तु पर, कंसोल में या स्क्रिप्ट में (जहां यह एक सूची देता है, जिसे आप प्रिंट कर सकते हैं या जो कुछ भी कर सकते हैं) को चला सकते हैं, और यह (लगभग) ) सभी विशेषताओं वस्तु। यदि आप यह जानने की कोशिश कर रहे हैं कि कोई अज्ञात वस्तु कैसे काम करती है।
Corley Brigman

जवाबों:


268

TL; DR: इसके _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, यह अंडरस्कोर केवल कोशिश करते हैं और संभव फ़ील्ड नाम के साथ संघर्ष को रोकने के लिए है।


नोट: कुछ २. p.५ <python संस्करण के लिए <३.५.० कोड जंगली में, आप इस संस्करण को देख सकते हैं:

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

थोड़ी देर के लिए प्रलेखन ने उल्लेख किया _asdictथा कि अप्रचलित था ( यहां देखें ), और अंतर्निहित विधि var का उपयोग करने का सुझाव दिया । वह सलाह अब पुरानी हो चुकी है; सबक्लासिंग से संबंधित बग को ठीक करने के लिए , जो __dict__संपत्ति नामांकितों पर मौजूद थी , उसे फिर से इस प्रतिबद्ध द्वारा हटा दिया गया है ।


1
किसी को पता है कि वहाँ एक स्थापित मिसाल है कि सुझाव है कि _asdictमानक पुस्तकालय में aliased नहीं होना चाहिए asdict?
कोबे जॉन

1
@KobeJohn तब आप "asdict"टपल नामों में से एक नहीं हो सकते थे ।
छायाकार

28

इसके namedtupleलिए इंस्टेंस पर एक बिल्ट इन मेथड है _asdict

जैसा कि टिप्पणियों में चर्चा की गई है, कुछ संस्करणों पर vars()भी करेंगे, लेकिन यह स्पष्ट रूप से बिल्ड विवरणों पर अत्यधिक निर्भर है, जबकि _asdictविश्वसनीय होना चाहिए। कुछ संस्करणों _asdictमें पदावनत के रूप में चिह्नित किया गया था, लेकिन टिप्पणियों से संकेत मिलता है कि यह अब 3.4 के रूप में नहीं है।


1
मैं downvoter नहीं था, लेकिन क्योंकि यह हो सकता है _asdictविधि की गई है python3 में obsoleted (वार्स के पक्ष में)
विम

इसके विपरीत, ऐसा लगता है कि varsकुछ पुराने संस्करणों पर काम नहीं करता है - 2.7 पर यह एक उठाता है TypeError, क्योंकि उस संस्करण की namedtupleकक्षा में __dict__विशेषता नहीं है ।
पीटर डेग्लॉपर

हाँ, मार्टिज़न और मैंने यहाँ चर्चा की है । यह 2.7 btw के नए संस्करणों पर काम करेगा (मैं 2.7.6 पर हूँ और यह काम करता है)
wim

मेरी उपरोक्त टिप्पणी पर संपादन विंडो को विगत करें - यह 2.7.5 पर विफल रहता है इसलिए इसे 2.7.6 के रूप में नया होना चाहिए। जब तक कि मेरा 2.7.5 निर्माण बंद नहीं हो जाता, जब तक कि मार्टिज़न लिंक किए गए उत्तर पर नहीं था? वैसे भी, ऐसा लगता है कि 2.7.5 पर काम करता है या नहीं यह बिल्ड बारीकियों पर निर्भर करता है।
पीटर डेग्लॉपर

8
(को हटाने से _asdict अब obseleted नहीं है (और अब एक OrderedDict रिटर्न), और वार्स अजगर 3.4 के साथ एक त्रुटि पैदा करता है: बस एक सिर ऊपर dict namedtuples की विशेषता)।
अलेक्जेंडर हुज़ाग ने

2

Ubuntu 14.04 LTS के संस्करणों पर python2.7 और python3.4 __dict__संपत्ति ने उम्मीद के मुताबिक काम किया। _asdict विधि भी काम किया है, लेकिन मैं स्थानीय असमान एपीआई के बजाय मानकों से परिभाषित, वर्दी, संपत्ति एपीआई का उपयोग करने झुका रहा हूँ।

$ python2.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 एक शब्दकोश का प्रतिनिधित्व soemthing पाने के लिए अर्थ भी तरह से, (कम से कम मेरी जानकारी के लिए) है।


प्रमुख पायथन संस्करणों और प्लेटफार्मों की एक तालिका और उनके समर्थन को जमा करना अच्छा होगा __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
लिनक्स-3.10.0-693.el7.x86_64-x86_64-centos-7.4.1708-Core, Python 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

यदि कोई _sdict () नहीं है, तो आप इस तरह से उपयोग कर सकते हैं:

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

पायथन 3. शब्दकोश के लिए आवश्यक सूचकांक के रूप में शब्दकोश में किसी भी क्षेत्र को आवंटित करें, मैंने 'नाम' का उपयोग किया।

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}

सहायक नहीं है क्योंकि आप जानते हैं कि नाम है। यह एक अंधी विधि होनी चाहिए
मिशेल करी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.