Maison >développement back-end >Tutoriel Python >Utilisation de la fonction nomméetuple dans l'analyse Python
【Recommandation associée : Tutoriel vidéo Python3】
Explication du code source :
def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None): """Returns a new subclass of tuple with named fields. >>> Point = namedtuple('Point', ['x', 'y']) >>> Point.__doc__ # docstring for the new class 'Point(x, y)' >>> p = Point(11, y=22) # instantiate with positional args or keywords >>> p[0] + p[1] # indexable like a plain tuple 33 >>> x, y = p # unpack like a regular tuple >>> x, y (11, 22) >>> p.x + p.y # fields also accessible by name 33 >>> d = p._asdict() # convert to a dictionary >>> d['x'] 11 >>> Point(**d) # convert from a dictionary Point(x=11, y=22) >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields Point(x=100, y=22) """
Structure grammaticale :
namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
nommé tuple, de sorte que le tuple soit accessible à l'aide d'une clé comme une liste (et peut également accessible via index).
collections.namedtuple est une fonction d'usine qui peut être utilisée pour construire un tuple avec des noms de champs et une classe nommée
La création d'un tuple nommé nécessite deux paramètres, l'un est le nom de la classe et l'autre est la classe Les noms de chacun. champ.
Les données stockées dans le champ correspondant doivent être transmises au constructeur sous la forme d'une série de paramètres (à noter que le constructeur de tuple n'accepte qu'un seul objet itérable).
Les tuples nommés ont également des propriétés uniques qui leur sont propres. Les plus utiles : les attributs de classe _fields, la méthode de classe _make(iterable) et la méthode d'instance _asdict().
Exemple de code 1 :
from collections import namedtuple # 定义一个命名元祖city,City类,有name/country/population/coordinates四个字段 city = namedtuple('City', 'name country population coordinates') tokyo = city('Tokyo', 'JP', 36.933, (35.689, 139.69)) print(tokyo) # _fields 类属性,返回一个包含这个类所有字段名称的元组 print(city._fields) # 定义一个命名元祖latLong,LatLong类,有lat/long两个字段 latLong = namedtuple('LatLong', 'lat long') delhi_data = ('Delhi NCR', 'IN', 21.935, latLong(28.618, 77.208)) # 用 _make() 通过接受一个可迭代对象来生成这个类的一个实例,作用跟City(*delhi_data)相同 delhi = city._make(delhi_data) # _asdict() 把具名元组以 collections.OrderedDict 的形式返回,可以利用它来把元组里的信息友好地呈现出来。 print(delhi._asdict())
Résultat d'exécution :
Exemple de code 2 :
from collections import namedtuple Person = namedtuple('Person', ['age', 'height', 'name']) data2 = [Person(10, 1.4, 'xiaoming'), Person(12, 1.5, 'xiaohong')] print(data2) res = data2[0].age print(res) res2 = data2[1].name print(res2)
Résultat d'exécution :
Exemple de code 3 :
from collections import namedtuple card = namedtuple('Card', ['rank', 'suit']) # 定义一个命名元祖card,Card类,有rank和suit两个字段 class FrenchDeck(object): ranks = [str(n) for n in range(2, 5)] + list('XYZ') suits = 'AA BB CC DD'.split() # 生成一个列表,用空格将字符串分隔成列表 def __init__(self): # 生成一个命名元组组成的列表,将suits、ranks两个列表的元素分别作为命名元组rank、suit的值。 self._cards = [card(rank, suit) for suit in self.suits for rank in self.ranks] print(self._cards) # 获取列表的长度 def __len__(self): return len(self._cards) # 根据索引取值 def __getitem__(self, item): return self._cards[item] f = FrenchDeck() print(f.__len__()) print(f.__getitem__(3))
Résultats d'exécution :
Exemple de code 4 :
from collections import namedtuple person = namedtuple('Person', ['first_name', 'last_name']) p1 = person('san', 'zhang') print(p1) print('first item is:', (p1.first_name, p1[0])) print('second item is', (p1.last_name, p1[1]))
Résultats d'exécution :
Exemple de code 5 : [_make crée une instance à partir d'une itération existante]
from collections import namedtuple course = namedtuple('Course', ['course_name', 'classroom', 'teacher', 'course_data']) math = course('math', 'ERB001', 'Xiaoming', '09-Feb') print(math) print(math.course_name, math.course_data) course_list = [ ('computer_science', 'CS001', 'Jack_ma', 'Monday'), ('EE', 'EE001', 'Dr.han', 'Friday'), ('Pyhsics', 'EE001', 'Prof.Chen', 'None') ] for k in course_list: course_i = course._make(k) print(course_i)
Résultat d'exécution :
Exemple de code 6 : [_asdict renvoie un nouveau dict ordonné, mappant les noms de champs aux valeurs correspondantes]
from collections import namedtuple person = namedtuple('Person', ['first_name', 'last_name']) zhang_san = ('Zhang', 'San') p = person._make(zhang_san) print(p) # 返回的类型不是dict,而是orderedDict print(p._asdict())
Résultat d'exécution :
Exemple de code 7 : [_re endroit renvoie une nouvelle instance et remplace le champ spécifié par une nouvelle valeur]
from collections import namedtuple person = namedtuple('Person', ['first_name', 'last_name']) zhang_san = ('Zhang', 'San') p = person._make(zhang_san) print(p) p_replace = p._replace(first_name='Wang') print(p_replace) print(p) p_replace2 = p_replace._replace(first_name='Dong') print(p_replace2)
Résultats d'exécution :
Exemple de code 8 : [_fields renvoie les noms de champs]
from collections import namedtuple person = namedtuple('Person', ['first_name', 'last_name']) zhang_san = ('Zhang', 'San') p = person._make(zhang_san) print(p) print(p._fields)
Résultats d'exécution :
Exemple de code 9 : [Utilisez des champs pour combiner deux tuples nommés]
from collections import namedtuple person = namedtuple('Person', ['first_name', 'last_name']) print(person._fields) degree = namedtuple('Degree', 'major degree_class') print(degree._fields) person_with_degree = namedtuple('person_with_degree', person._fields + degree._fields) print(person_with_degree._fields) zhang_san = person_with_degree('san', 'zhang', 'cs', 'master') print(zhang_san)
Résultats d'exécution :
Exemple de code 10 : [field_defaults]
from collections import namedtuple person = namedtuple('Person', ['first_name', 'last_name'], defaults=['san']) print(person._fields) print(person._field_defaults) print(person('zhang')) print(person('Li', 'si'))
Résultats d'exécution :
Exemple de code 11 : [namedtuple est une classe, la fonction peut donc être modifiée via des sous-classes]
from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(4, 5) print(p) class Point(namedtuple('Point', ['x', 'y'])): __slots__ = () @property def hypot(self): return self.x + self.y def hypot2(self): return self.x + self.y def __str__(self): return 'result is %.3f' % (self.x + self.y) aa = Point(4, 5) print(aa) print(aa.hypot) print(aa.hypot2)
Résultats d'exécution :
Exemple de code 12 : [Remarque Observez la différence entre les deux écritures méthodes]
from collections import namedtuple Point = namedtuple("Point", ["x", "y"]) p = Point(11, 22) print(p) print(p.x, p.y) # namedtuple本质上等于下面写法 class Point2(object): def __init__(self, x, y): self.x = x self.y = y o = Point2(33, 44) print(o) print(o.x, o.y)
Résultats d'exécution :
[Recommandations associées :Tutoriel vidéo Python3]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!