পাইথনে "টিপলস নামক" কী কী?


906

পড়া পাইথন ৩.১- পরিবর্তনগুলি পড়তে , আমি কিছু পেয়েছি ... অপ্রত্যাশিত:

Sys.version_info টিপল এখন একটি নামযুক্ত টিপল :

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

সুতরাং, আমার প্রশ্নগুলি হ'ল:

  • টিপলস নামকরণ কি?
  • এগুলি কীভাবে ব্যবহার করবেন?
  • কেন / কখন আমার সাধারণ টিউপসগুলির পরিবর্তে নামযুক্ত টিপলগুলি ব্যবহার করা উচিত?
  • কেন / কখন নামযুক্ত টিপলগুলির পরিবর্তে আমার সাধারণ টিপলগুলি ব্যবহার করা উচিত?
  • "নামযুক্ত তালিকাগুলি" (নামযুক্ত টুপলের একটি পরিবর্তনীয় সংস্করণ) কি কোনও ধরণের আছে?

উত্তর:


1194

নামযুক্ত টিপলগুলি মূলত তৈরি করা সহজ, লাইটওয়েট অবজেক্টের ধরণের। নামযুক্ত টুপল দৃষ্টান্তগুলিকে অবজেক্টের মতো ভেরিয়েবল ডেরেফরেন্সিং বা স্ট্যান্ডার্ড টুপল সিনট্যাক্স ব্যবহার করে উল্লেখ করা যেতে পারে। এগুলি একইভাবে structবা অন্যান্য সাধারণ রেকর্ড প্রকারের মতো ব্যবহার করা যেতে পারে , কেবলমাত্র তারা পরিবর্তনযোগ্য। এগুলি পাইথন ২. 2. এবং পাইথন ৩.০ এ যুক্ত করা হয়েছে, যদিও পাইথন ২.৪ এ প্রয়োগের রেসিপি রয়েছে

উদাহরণস্বরূপ, টিপল হিসাবে একটি পয়েন্ট উপস্থাপন করা সাধারণ (x, y)। এটি নীচের মত কোড বাড়ে:

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)

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

from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)

তবে, নামযুক্ত টিপলগুলি এখনও সাধারণ টিউপসগুলির সাথে পিছনের দিকে সামঞ্জস্যপূর্ণ, তাই নিম্নলিখিতটি এখনও কার্যকর হবে:

Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
 # use tuple unpacking
x1, y1 = pt1

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

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

class Point(namedtuple('Point', 'x y')):
    [...]

তবে, টিউপসগুলির মতো, নামযুক্ত টিপলগুলিতে বৈশিষ্ট্যগুলি অপরিবর্তনীয়:

>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute

আপনি যদি মানগুলি পরিবর্তন করতে সক্ষম হতে চান তবে আপনার অন্য ধরণের প্রয়োজন। পরিবর্তনীয় রেকর্ড টাইপগুলির জন্য একটি কার্যকর রেসিপি রয়েছে যা আপনাকে বৈশিষ্ট্যে নতুন মান সেট করতে দেয়।

>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
    2.0

তবে "নামযুক্ত তালিকার" কোনও ফর্ম সম্পর্কে আমি সচেতন নই যা আপনাকে নতুন ক্ষেত্রগুলি যুক্ত করতে দেয়। আপনি এই পরিস্থিতিতে একটি অভিধান ব্যবহার করতে পারেন। নামযুক্ত টিপলগুলি অভিধানে রূপান্তর করতে পারে pt1._asdict()যা ব্যবহার করে{'x': 1.0, 'y': 5.0} এবং সমস্ত সাধারণ অভিধান ফাংশন দিয়ে চালিত করা যায়।

ইতিমধ্যে উল্লিখিত হিসাবে, এই উদাহরণগুলি তৈরি করা হয়েছিল এমন আরও তথ্যের জন্য আপনার ডকুমেন্টেশন চেক করা উচিত ।


35
অজগর ৩.7 থেকে, ডেটাচলাসকে বিকল্প হিসাবে বিবেচনা করুন (ব্যাকপোর্টটি ৩.6-তে উপলব্ধ, তবে পূর্ববর্তী সংস্করণ নয়)
8

3
আপনার যদি পরিবর্তনীয় রেকর্ড টাইপের প্রয়োজন হয়__slots__
ম্যাডজোহন

আরসিডি টাইপ না করে ডেটা ক্লাচ ব্যবহারের মূল কারণটি
ভয়েজার

অভি বিকল্প অ্যাট্রিবিউট অভিধান হল stackoverflow.com/questions/4984647/...
mrgloom

আপনি যে উত্তরটি সর্বদা সন্ধান করেন এটি হ'ল, এটি উল্লেখ করার মতো হতে পারে যে এখন এমনও রয়েছে typing.NamedTupleযা টাইপ ইঙ্গিতগুলির জন্য অনুমতি দেয় এবং সাবক্লাসিংয়ের জন্য বিশেষত সুবিধাজনক।
ডেরওহ

101

নামটুপল টিউপল ক্লাস তৈরির জন্য একটি ফ্যাক্টরি ফাংশন । এই শ্রেণীর সাহায্যে আমরা এমন টিপলস তৈরি করতে পারি যা নাম অনুসারে কলযোগ্য।

import collections

#Create a namedtuple class with names "a" "b" "c"
Row = collections.namedtuple("Row", ["a", "b", "c"], verbose=False, rename=False)   

row = Row(a=1,b=2,c=3) #Make a namedtuple from the Row class we created

print row    #Prints: Row(a=1, b=2, c=3)
print row.a  #Prints: 1
print row[0] #Prints: 1

row = Row._make([2, 3, 4]) #Make a namedtuple from a list of values

print row   #Prints: Row(a=2, b=3, c=4)

5
ভার্বোস এবং নাম পরিবর্তন করে প্যারামিটারগুলি ডিফল্টরূপে মিথ্যাতে ডিফল্ট হয় তাই তাদের এই মানটিতে স্পষ্টভাবে সেট করার দরকার নেই।
ত্রিশ্মিগিস্টোস

namedtuple is a factory function for making a tuple class.এখানে সম্ভবত এটিই একমাত্র সঠিক উত্তর: পি
মিঃ_আর_মিরস_ডি

90

টিপলস নামকরণ কি?

একটি নামকরণ tuple একটি tuple হয়।

এটি একটি tuple করতে পারেন সবকিছু।

তবে এটি কেবল একটি টিপল ছাড়াও।

এটি একটি টিউপলের একটি নির্দিষ্ট সাবক্লাস যা নামকরণ ক্ষেত্র এবং একটি নির্দিষ্ট দৈর্ঘ্য সহ আপনার স্পেসিফিকেশনটিতে প্রোগ্রামগতভাবে তৈরি করা হয়।

এটি, উদাহরণস্বরূপ, টুপলের একটি সাবক্লাস তৈরি করে এবং স্থির দৈর্ঘ্য (এই ক্ষেত্রে তিনটি) বাদ দিয়ে, এটি যেখানেই ব্যবহৃত হয় বিনাশ ছাড়াই একটি টুপল ব্যবহৃত হয়। এটি লিসকভ সাবস্টিটিবিলিটি হিসাবে পরিচিত।

পাইথন ৩.6-এ নতুন , আমরা একটি ক্লাস সংজ্ঞা ব্যবহারtyping.NamedTupleকরে একটি নেমটুপল তৈরি করতে পারি:

from typing import NamedTuple

class ANamedTuple(NamedTuple):
    """a docstring"""
    foo: int
    bar: str
    baz: list

উপরেরটি নীচের মত একই, উপরের অতিরিক্তটি টাইপ টিকা এবং একটি ডাস্ট্রিং রয়েছে। নীচে পাইথন 2+ এ উপলব্ধ:

>>> from collections import namedtuple
>>> class_name = 'ANamedTuple'
>>> fields = 'foo bar baz'
>>> ANamedTuple = namedtuple(class_name, fields)

এটি এটি তাত্ক্ষণিক করে তোলে:

>>> ant = ANamedTuple(1, 'bar', [])

আমরা এটি পরিদর্শন করতে পারি এবং এর বৈশিষ্ট্যগুলি ব্যবহার করতে পারি:

>>> ant
ANamedTuple(foo=1, bar='bar', baz=[])
>>> ant.foo
1
>>> ant.bar
'bar'
>>> ant.baz.append('anything')
>>> ant.baz
['anything']

আরও গভীর ব্যাখ্যা

নামের টিপলগুলি বুঝতে, আপনাকে প্রথমে টিপল কী তা জানতে হবে। একটি টিপল মূলত একটি অপরিবর্তনীয় (স্মৃতিতে স্থান পরিবর্তন করা যায় না) তালিকা list

আপনি কীভাবে নিয়মিত টিপল ব্যবহার করতে পারেন তা এখানে:

>>> student_tuple = 'Lisa', 'Simpson', 'A'
>>> student_tuple
('Lisa', 'Simpson', 'A')
>>> student_tuple[0]
'Lisa'
>>> student_tuple[1]
'Simpson'
>>> student_tuple[2]
'A'

আপনি পুনরাবৃত্তযোগ্য আনপ্যাকিং সহ একটি টুপল প্রসারিত করতে পারেন:

>>> first, last, grade = student_tuple
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'

নামযুক্ত টিউপসগুলি এমন টিপলস যা তাদের উপাদানগুলিকে কেবল সূচকের পরিবর্তে নাম দিয়ে অ্যাক্সেস করতে দেয়!

আপনি এটির মতো নামকরণ করেছেন:

>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['first', 'last', 'grade'])

আপনি স্পেস দ্বারা পৃথক করা নামগুলির সাথে একটি একক স্ট্রিংও ব্যবহার করতে পারেন, এপিআইয়ের কিছুটা আরও পঠনযোগ্য ব্যবহার:

>>> Student = namedtuple('Student', 'first last grade')

এগুলি কীভাবে ব্যবহার করবেন?

আপনি টিপলস যা করতে পারেন তা করতে পারেন (উপরে দেখুন) পাশাপাশি নিম্নলিখিতগুলি করতে পারেন:

>>> named_student_tuple = Student('Lisa', 'Simpson', 'A')
>>> named_student_tuple.first
'Lisa'
>>> named_student_tuple.last
'Simpson'
>>> named_student_tuple.grade
'A'
>>> named_student_tuple._asdict()
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> vars(named_student_tuple)
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> new_named_student_tuple = named_student_tuple._replace(first='Bart', grade='C')
>>> new_named_student_tuple
Student(first='Bart', last='Simpson', grade='C')

একজন মন্তব্যকারী জিজ্ঞাসা করলেন:

একটি বড় স্ক্রিপ্ট বা প্রোগ্রামে, একজন সাধারণত একটি নামযুক্ত টিপল সংজ্ঞা দেয় কোথায়?

আপনি যে ধরণের মাধ্যমে তৈরি করেন namedtuple তা হ'ল মূলত ক্লাস যা আপনি সহজ শর্টহ্যান্ড সহ তৈরি করতে পারেন। তাদের ক্লাসের মতো আচরণ করুন। তাদের মডিউল স্তরে সংজ্ঞায়িত করুন, যাতে আচার এবং অন্যান্য ব্যবহারকারীরা সেগুলি খুঁজে পেতে পারে।

কার্যকারী উদাহরণ, বৈশ্বিক মডিউল স্তরে:

>>> from collections import namedtuple
>>> NT = namedtuple('NT', 'foo bar')
>>> nt = NT('foo', 'bar')
>>> import pickle
>>> pickle.loads(pickle.dumps(nt))
NT(foo='foo', bar='bar')

এবং এটি সংজ্ঞাটি অনুসন্ধানে ব্যর্থতা প্রদর্শন করে:

>>> def foo():
...     LocalNT = namedtuple('LocalNT', 'foo bar')
...     return LocalNT('foo', 'bar')
... 
>>> pickle.loads(pickle.dumps(foo()))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class '__main__.LocalNT'>: attribute lookup LocalNT on __main__ failed

কেন / কখন আমার সাধারণ টিউপসগুলির পরিবর্তে নামযুক্ত টিপলগুলি ব্যবহার করা উচিত?

এগুলি ব্যবহার করুন যখন এটি আপনার কোডটিতে টিপল উপাদানগুলির শব্দার্থক শব্দগুলি প্রকাশ করার জন্য আপনার কোডটিকে উন্নত করে।

আপনি অন্যথায় অপরিবর্তনযোগ্য ডেটা অ্যাট্রিবিউট এবং কোনও কার্যকারিতা সহ কোনও অবজেক্টটি ব্যবহার না করে আপনি কোনও বস্তুর পরিবর্তে এগুলি ব্যবহার করতে পারেন।

কার্যকারিতা যুক্ত করতে আপনি এগুলি সাবক্লাস করতে পারেন , উদাহরণস্বরূপ :

class Point(namedtuple('Point', 'x y')):
    """adding functionality to a named tuple"""
        __slots__ = ()
        @property
        def hypot(self):
            return (self.x ** 2 + self.y ** 2) ** 0.5
        def __str__(self):
            return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)

কেন / কখন নামযুক্ত টিপলগুলির পরিবর্তে আমার সাধারণ টিপলগুলি ব্যবহার করা উচিত?

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

টিউপলস বনাম টিপলস দ্বারা ব্যবহৃত কোনও অতিরিক্ত মেমরি নেই।

"নামযুক্ত তালিকাগুলি" (নামযুক্ত টুপলের একটি পরিবর্তনীয় সংস্করণ) কি কোনও ধরণের আছে?

আপনি এমন একটি স্লটেড অবজেক্টের সন্ধান করছেন যা স্ট্যাটিক্যালি মাপের তালিকার সমস্ত কার্যকারিতা কার্যকর করে বা একটি উপ-শ্রেণিবদ্ধ তালিকা যা নামকৃত টিপলের মতো কাজ করে (এবং এটি কোনওভাবে আকার পরিবর্তন হতে বাধা দেয়))

এটি এখন প্রসারিত, এবং সম্ভবত লিসকভেরও বিকল্পের প্রথমটির উদাহরণ:

from collections import Sequence

class MutableTuple(Sequence): 
    """Abstract Base Class for objects that work like mutable
    namedtuples. Subclass and define your named fields with 
    __slots__ and away you go.
    """
    __slots__ = ()
    def __init__(self, *args):
        for slot, arg in zip(self.__slots__, args):
            setattr(self, slot, arg)
    def __repr__(self):
        return type(self).__name__ + repr(tuple(self))
    # more direct __iter__ than Sequence's
    def __iter__(self): 
        for name in self.__slots__:
            yield getattr(self, name)
    # Sequence requires __getitem__ & __len__:
    def __getitem__(self, index):
        return getattr(self, self.__slots__[index])
    def __len__(self):
        return len(self.__slots__)

এবং ব্যবহারের জন্য, কেবল সাবক্লাস এবং সংজ্ঞা দিন __slots__:

class Student(MutableTuple):
    __slots__ = 'first', 'last', 'grade' # customize 


>>> student = Student('Lisa', 'Simpson', 'A')
>>> student
Student('Lisa', 'Simpson', 'A')
>>> first, last, grade = student
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'
>>> student[0]
'Lisa'
>>> student[2]
'A'
>>> len(student)
3
>>> 'Lisa' in student
True
>>> 'Bart' in student
False
>>> student.first = 'Bart'
>>> for i in student: print(i)
... 
Bart
Simpson
A

44

নেমডটপলসগুলি দুর্দান্ত বৈশিষ্ট্য, এগুলি ডেটার জন্য উপযুক্ত পাত্রে। যখন আপনার "ডেটা" সঞ্চয় করতে হয় আপনি টিপলস বা অভিধান ব্যবহার করবেন যেমন:

user = dict(name="John", age=20)

বা:

user = ("John", 20)

অভিধানের পদ্ধতিটি অপ্রতিরোধ্য, যেহেতু ডিকটি পারস্পরিক পরিবর্তন এবং টিপলগুলির চেয়ে ধীর। অন্যদিকে, টিপলগুলি অপরিবর্তনীয় এবং হালকা ওজনের তবে ডেটা ক্ষেত্রগুলিতে প্রচুর সংখ্যক এন্ট্রিগুলির পাঠযোগ্যতার অভাব রয়েছে।

নেমেডটপলসগুলি দুটি পদ্ধতির জন্য নিখুঁত সমঝোতা, এগুলির দুর্দান্ত পাঠযোগ্যতা, স্বল্পতা এবং অপরিবর্তনশীলতা রয়েছে (আরও তারা বহুবিধ!)।


9
মন যদি নাম ধরে তাদের গুণাবলীর অ্যাক্সেস যে namedtuples ধীর পথ dicts তুলনায় রাখবেন: ntuple.fooবনাম ntuple[1]আধুনিক অনেক দ্রুততর। এটা আরও: stackoverflow.com/questions/2646157/...
Rotareti

28

নামযুক্ত টিপলস কোডটির সাথে পিছনে সামঞ্জস্য করার অনুমতি দেয় যা এই জাতীয় সংস্করণটি পরীক্ষা করে

>>> sys.version_info[0:2]
(3, 1)

ভবিষ্যতের কোডটি এই সিনট্যাক্সটি ব্যবহার করে আরও স্পষ্ট করার সুযোগ দেওয়ার সময়

>>> sys.version_info.major
3
>>> sys.version_info.minor
1

12

namedtuple

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

from collections import namedtuple

Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])

 p = Color(170, 0.1, 0.6)
 if p.saturation >= 0.5:
     print "Whew, that is bright!"
 if p.luminosity >= 0.5:
     print "Wow, that is light"

টিপলে প্রতিটি উপাদানকে নামকরণ না করেই এটি পড়তে হবে:

p = (170, 0.1, 0.6)
if p[1] >= 0.5:
    print "Whew, that is bright!"
if p[2]>= 0.5:
   print "Wow, that is light"

প্রথম উদাহরণে কী চলছে তা বোঝা এত কঠিন। একটি নেমটুপল সহ, প্রতিটি ক্ষেত্রের একটি নাম রয়েছে। এবং আপনি অবস্থান বা সূচীর চেয়ে নাম দ্বারা এটি অ্যাক্সেস করতে পারেন। পরিবর্তেp[1] , আমরা এটি পি.স্যাচুরেশন বলতে পারি। এটা বোঝা সহজ। এবং এটি আরও পরিষ্কার দেখাচ্ছে।

অভিধান তৈরির চেয়ে নেমেডটুপলের উদাহরণ তৈরি করা সহজ।

# dictionary
>>>p = dict(hue = 170, saturation = 0.1, luminosity = 0.6)
>>>p['hue']
170

#nametuple
>>>from collections import namedtuple
>>>Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])
>>>p = Color(170, 0.1, 0.6)
>>>p.hue
170

আপনি কখন নেমটুপল ব্যবহার করতে পারেন

  1. যেমনটি বলা হয়েছে, নেমটুপল টিউপলগুলি বোঝা আরও সহজ করে তোলে। সুতরাং যদি আপনাকে টিপলে আইটেমগুলি উল্লেখ করতে হয়, তবে সেগুলি নেমডটপলস হিসাবে তৈরি করা ঠিক অর্থপূর্ণ।
  2. অভিধানের চেয়ে হালকা ওজনের পাশাপাশি নেমটুপলও অভিধানটির বিপরীতে অর্ডার রাখে।
  3. উপরের উদাহরণের মতো, অভিধানের চেয়ে নামফলকের উদাহরণ তৈরি করা সহজ। এবং নামের টিপলে আইটেমটি উল্লেখ করা অভিধানের চেয়ে পরিষ্কার দেখায়। p.hueবরং p['hue']

বাক্য গঠন

collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
  • নামটুপল সংগ্রহ লাইব্রেরিতে রয়েছে।
  • টাইপনেম: এটি নতুন টিপল সাবক্লাসের নাম।
  • ক্ষেত্রের নাম: প্রতিটি ক্ষেত্রের জন্য নামের ক্রম। এটি কোনও তালিকা ['x', 'y', 'z']বা স্ট্রিংয়ের মতো ক্রম হতে পারে x y z(কমা ছাড়াই, কেবল সাদা স্থান) বা x, y, z
  • পুনঃনামকরণ: পুনরায় নামকরণ করা হলে True, অবৈধ ক্ষেত্র নামগুলি স্থায়ী নামগুলির সাথে স্বয়ংক্রিয়ভাবে প্রতিস্থাপন করা হয়। উদাহরণস্বরূপ, কীওয়ার্ড (যেহেতু এটি ফাংশনগুলি সংজ্ঞায়িত করার জন্য সংরক্ষিত শব্দ) এবং নকল ক্ষেত্রের নাম মুছে ['abc', 'def', 'ghi','abc']ফেলাতে রূপান্তরিত হয় ।['abc', '_1', 'ghi', '_3']'def''abc'
  • ক্রিয়াপদ: ভার্বোজ হয় True, বর্গ সংজ্ঞা নির্মিত হওয়ার ঠিক আগে মুদ্রিত হয়।

আপনি যদি এখনও চান তবে তাদের অবস্থান অনুসারে নামবিহীন শীর্ষগুলিতে অ্যাক্সেস করতে পারেন। p[1] == p.saturation। এটি এখনও নিয়মিত টিউপলের মতো আনপ্যাক করে।

পদ্ধতি

নিয়মিত সমস্ত টিপল পদ্ধতি সমর্থিত। উদাহরণস্বরূপ: মিনিট (), সর্বাধিক (), লেন (), ইন না, কনট্যাকটেশন (+), সূচক, স্লাইস ইত্যাদি And দ্রষ্টব্য: এগুলি সমস্ত একটি আন্ডারস্কোর দিয়ে শুরু হয়। _replace, _make, _asdict

_replace সুনির্দিষ্ট ক্ষেত্রগুলিকে নতুন মানগুলির সাথে প্রতিস্থাপন করা নামযুক্ত টিউপলের একটি নতুন উদাহরণ দেয়।

বাক্য গঠন

somenamedtuple._replace(kwargs)

উদাহরণ

>>>from collections import namedtuple

>>>Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])
>>>p = Color(170, 0.1, 0.6)

>>>p._replace(hue=87)
Color(87, 0.1, 0.6)

>>>p._replace(hue=87, saturation=0.2)
Color(87, 0.2, 0.6)

বিজ্ঞপ্তি : ক্ষেত্রের নাম উদ্ধৃতিতে নেই; তারা এখানে কীওয়ার্ড। মনে রাখবেন : টিপলগুলি অপরিবর্তনীয় - এমনকি যদি সেগুলি নামভুক্ত থাকে এবং _replaceপদ্ধতিটি থাকে। _replaceএকটি উত্পাদন করে newদৃষ্টান্ত; এটি আসলটি পরিবর্তন করে না বা পুরানো মান প্রতিস্থাপন করে না। আপনি অবশ্যই ভেরিয়েবল এ নতুন ফলাফল সংরক্ষণ করতে পারেন।p = p._replace(hue=169)

_make

বিদ্যমান ক্রম বা পুনরাবৃত্তীয় থেকে একটি নতুন উদাহরণ তৈরি করে M

বাক্য গঠন

somenamedtuple._make(iterable)

উদাহরণ

 >>>data = (170, 0.1, 0.6)
 >>>Color._make(data)
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make([170, 0.1, 0.6])  #the list is an iterable
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make((170, 0.1, 0.6))  #the tuple is an iterable
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make(170, 0.1, 0.6) 
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "<string>", line 15, in _make
TypeError: 'float' object is not callable

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

_asdict

একটি নতুন অর্ডারডিক্ট প্রদান করে যা ক্ষেত্রের নামগুলি তাদের সম্পর্কিত মানগুলিতে মানচিত্র করে।

বাক্য গঠন

somenamedtuple._asdict()

উদাহরণ

 >>>p._asdict()
OrderedDict([('hue', 169), ('saturation', 0.1), ('luminosity', 0.6)])

তথ্যসূত্র : https://www.reddit.com/r/Python/comments/38ee9d/intro_to_nametuple/

নামযুক্ত তালিকার নামও রয়েছে যা নামযুক্ত টুপলের সাথে মিলে যায় তবে পরিবর্তনযোগ্য https://pypi.python.org/pypi/namelist


তবে খেয়াল করুন, পিইপি 8 অনুসারে একটি একক আন্ডারস্কোরকে তার নিজস্ব আচরণের সাথে "দুর্বল" অভ্যন্তরীণ ব্যবহার "সূচক" হিসাবে বিবেচনা করা হয়। শুরু হওয়া ফাংশনগুলির ব্যবহার করার সময় সাবধান _!
জেনস

8

নামডাল কী?

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

এগুলি কীভাবে ব্যবহার করবেন?

>>>from collections import namedtuple
>>>saleRecord = namedtuple('saleRecord','shopId saleDate salesAmout totalCustomers')
>>>
>>>
>>>#Assign values to a named tuple 
>>>shop11=saleRecord(11,'2015-01-01',2300,150) 
>>>shop12=saleRecord(shopId=22,saleDate="2015-01-01",saleAmout=1512,totalCustomers=125)

পড়া

>>>#Reading as a namedtuple
>>>print("Shop Id =",shop12.shopId)
12
>>>print("Sale Date=",shop12.saleDate)
2015-01-01
>>>print("Sales Amount =",shop12.salesAmount)
1512
>>>print("Total Customers =",shop12.totalCustomers)
125

সিএসভি প্রসেসিংয়ে আকর্ষণীয় পরিস্থিতি:

from csv import reader
from collections import namedtuple

saleRecord = namedtuple('saleRecord','shopId saleDate totalSales totalCustomers')
fileHandle = open("salesRecord.csv","r")
csvFieldsList=csv.reader(fileHandle)
for fieldsList in csvFieldsList:
    shopRec = saleRecord._make(fieldsList)
    overAllSales += shopRec.totalSales;

print("Total Sales of The Retail Chain =",overAllSales)

5

পাইথনের অভ্যন্তরে একটি নামযুক্ত টুপল নামে পরিচিত ধারকটির ভাল ব্যবহার রয়েছে, এটি শ্রেণীর সংজ্ঞা তৈরি করতে ব্যবহার করা যেতে পারে এবং মূল টিপলের সমস্ত বৈশিষ্ট্য রয়েছে।

নামী টুপল ব্যবহার করে একটি সাধারণ বর্গ তৈরি করতে সরাসরি ডিফল্ট শ্রেণির টেম্পলেটটিতে প্রয়োগ করা হবে, এই পদ্ধতিটি পাঠযোগ্যতার উন্নতি করতে প্রচুর কোড দেয় এবং শ্রেণি নির্ধারণের সময় এটি খুব সুবিধাজনকও হয়।


2

নামযুক্ত টিপল ব্যবহারের অন্য একটি উপায় (একটি নতুন উপায়) টাইপ করা প্যাকেজ থেকে নামডটপল ব্যবহার করছে: নামডটপলে ইঙ্গিতগুলি টাইপ করুন

কীভাবে এটি ব্যবহার করবেন তা দেখতে আসুন এই পোস্টে শীর্ষ উত্তরের উদাহরণটি ব্যবহার করুন।

(1) নামযুক্ত টিপল ব্যবহার করার আগে কোডটি এরকম:

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
print(line_length)

(2) এখন আমরা নামকরণ tuple ব্যবহার

from typing import NamedTuple, Number

নামডটুপল ক্লাসের উত্তরাধিকারী হোন এবং নতুন শ্রেণিতে ভেরিয়েবল নামটি সংজ্ঞায়িত করুন। পরীক্ষা ক্লাসের নাম।

class test(NamedTuple):
x: Number
y: Number

ক্লাস থেকে উদাহরণ তৈরি করুন এবং তাদের মান নির্ধারণ করুন

pt1 = test(1.0, 5.0)   # x is 1.0, and y is 5.0. The order matters
pt2 = test(2.5, 1.5)

গণনা করতে দৃষ্টান্ত থেকে ভেরিয়েবল ব্যবহার করুন

line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)
print(line_length)

1

এটা চেষ্টা কর:

collections.namedtuple()

মূলত, namedtuplesহালকা ওজনের বস্তুর প্রকার তৈরি করা সহজ। তারা সাধারণ কাজের জন্য সুবিধাজনক পাত্রে টুপলসকে পরিণত করে। এর সাথে namedtuples, আপনাকে কোনও টিপলের সদস্যদের অ্যাক্সেসের জন্য পূর্ণসংখ্যার সূচকগুলি ব্যবহার করতে হবে না।

উদাহরণ:

কোড 1:

>>> from collections import namedtuple

>>> Point = namedtuple('Point','x,y')

>>> pt1 = Point(1,2)

>>> pt2 = Point(3,4)

>>> dot_product = ( pt1.x * pt2.x ) +( pt1.y * pt2.y )

>>> print dot_product
11

কোড 2:

>>> from collections import namedtuple

>>> Car = namedtuple('Car','Price Mileage Colour Class')

>>> xyz = Car(Price = 100000, Mileage = 30, Colour = 'Cyan', Class = 'Y')

>>> print xyz

Car(Price=100000, Mileage=30, Colour='Cyan', Class='Y')
>>> print xyz.Class
Y

-1

অন্য প্রত্যেকে এরই মধ্যে এর উত্তর দিয়ে গেছে, তবে আমি মনে করি আমার এখনও যোগ করার মতো আরও কিছু আছে।

ক্লাস সংজ্ঞায়িত করার জন্য নামডটপলকে স্বজ্ঞাতভাবে শর্টকাট হিসাবে বিবেচনা করা যেতে পারে।

একটি সংজ্ঞায়িত করার জন্য একটি জটিল এবং প্রচলিত উপায় দেখুন class

class Duck:
    def __init__(self, color, weight):
        self.color = color
        self.weight = weight
red_duck = Duck('red', '10')

    In [50]: red_duck
    Out[50]: <__main__.Duck at 0x1068e4e10>
    In [51]: red_duck.color
    Out[51]: 'red'

জন্য namedtuple

from collections import namedtuple
Duck = namedtuple('Duck', ['color', 'weight'])
red_duck = Duck('red', '10')

In [54]: red_duck
Out[54]: Duck(color='red', weight='10')
In [55]: red_duck.color
Out[55]: 'red'

2
দুঃখিত, তবে এটি ভুল। : নামে tuple এই সমর্থন red_duck[0]বা len(red_duck)বা for x in red_duck: print(x)। তদতিরিক্ত, নামযুক্ত টিপলগুলি অপরিবর্তনীয়, সুতরাং এই ক্রিয়াকলাপগুলি ব্যর্থ হবে: red_duck[0] = 2, red_duck.foo = 'bar'। যেহেতু এগুলি অপরিবর্তনীয়, নামযুক্ত টিপলগুলি dictকী হিসাবে ব্যবহৃত হতে পারে ।
ডেনিলসন সা মিয়া

হ্যাঁ, এটি বুনিয়াদি।
ক্যালকুলাস

1
@ জাওসউ না, এটি "বেসিকস" নয়। নামযুক্ত টিপলস নিয়মিত ক্লাসগুলির তুলনায় সম্পূর্ণ আলাদা কার্যকারিতা সেট করে। মূলত tuples নামের একটি শ্রেণি হলেও এর অর্থ এই নয় যে ক্লাসগুলির নাম tuples দেওয়া হয়েছে।
কানেক্টইউরচার্জার ২
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.