>  기사  >  백엔드 개발  >  Python이 이름을 시퀀스 요소(코드)에 매핑하는 방법

Python이 이름을 시퀀스 요소(코드)에 매핑하는 방법

不言
不言앞으로
2018-10-23 16:14:242241검색

이 기사의 내용은 Python이 이름을 시퀀스 요소(코드)에 매핑하는 방법에 대한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. 요구 사항

우리 코드는 위치(예: 색인 또는 아래 첨자)를 통해 목록에 액세스하지만 때로는 이로 인해 코드가 읽기가 조금 어렵습니다. 우리는 이름으로 요소에 액세스할 수 있기를 원하므로 구조의 위치에 대한 의존성을 줄입니다.

2. 솔루션

일반 튜플과 비교할 때 collections.namedtuple()(튜플이라는 이름)은 이러한 편의를 거의 추가하지 않습니다. 실제로 collections.namedtuple()은 Python에서 표준 튜플 유형의 하위 클래스를 반환하는 팩토리 메서드입니다. 유형 이름과 해당 필드를 제공하고 정의한 필드에 대한 값을 전달하여 인스턴스화 가능한 클래스를 반환합니다.

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined'])
sub=Subscriber("1782980833@qq.com","2018-10-23")
print(sub)
print(sub.addr)
print(sub.joined)
print(len(sub))
addr,joined=sub
print(addr)
print(joined)
#下面错误,以为你namedtuple是不可变的
#sub.joined="2019"

결과:

Subsciber(addr='1782980833@qq.com', joined='2018-10-23')
1782980833@qq.com
2018-10-23
2
1782980833@qq.com
2018-10-23

네임드튜플의 인스턴스는 일반 클래스 인스턴스처럼 보이지만 해당 인스턴스는 일반 튜플과 호환 가능하며 일반 튜플에서 지원하는 모든 작업을 지원합니다.

네임드 튜플의 주요 기능은 코드가 제어하는 ​​요소의 위치에서 코드를 분리하는 것입니다. 따라서 데이터베이스 호출에서 큰 튜플 목록을 얻고 위치별로 요소에 액세스하는 경우 양식에 새 열을 추가하면 코드가 충돌하지만 반환된 튜플이 먼저 명명된 튜플로 변환되면 문제가 없을 것입니다.

이 문제를 설명하기 위해 다음은 일반 튜플을 사용하는 일부 코드입니다.

def compute_cost(records):
    total=0.0
    for rec in records:
        total+=rec[1]*rec[2]
    return total

요소를 위치별로 참조하면 코드의 표현력이 떨어지고 의존도가 높아지는 경우가 많습니다. 레코드의 특정 구조 .

다음은 네임드 튜플을 사용한 버전입니다:

from collections import namedtuple
Stock=namedtuple('Stock',['name','shares','price'])
def compute_cost(records):
    total=0.0
    for rec in records:
        s=Stock(*rec)
        total+=s.shares*s.price
    return total

3

namedtuple 가능성 분석 사용법은 저장하는 데 더 많은 공간이 필요한 사전을 대체하는 것입니다. 따라서 대규모 데이터 디자인 사전을 구축하려는 경우 네임드튜플(namedtuple)을 사용하는 것이 더 효율적이겠지만, 네임드튜플은 사전과 달리 불변(immutable)이라는 점에 유의하시기 바랍니다.

속성을 수정해야 하는 경우 명명된 튜플 인스턴스_replace() 메서드를 사용하면 됩니다. 이 메서드는 새 명명된 튜플을 만들고 해당 값을 바꿉니다.

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined'])
sub=Subscriber("1782980833@qq.com","2018-10-23")

print(sub)

sub=sub._replace(joined="2018-10-24")
print(sub)

결과:

Subsciber(addr='1782980833@qq.com', joined='2018-10-23')
Subsciber(addr='1782980833@qq.com', joined='2018-10-24')

_replace() 메소드에는 미묘한 목적이 있습니다. 즉, 필드를 채우는 간단한 방법으로 사용할 수 있다는 것입니다. 누락된 필드의 선택적 또는 명명된 튜플. 이렇게 하려면 먼저 기본값이 포함된 프로토타입 배열을 만든 다음 _replace() 메서드를 사용하여 새 인스턴스를 만들고 해당 값을 바꿉니다.

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined','age'])
sub=Subscriber("",None,0)

def dict_to_stock(s):
    return sub._replace(**s)

a={"addr":"111111@qq.com","joined":"1111-11-11","age":11}
a=dict_to_stock(a)
print(a)

b={"addr":"111111@qq.com","joined":"1111-11-11"}
b=dict_to_stock(b)
print(b)

결과:

Subsciber(addr='111111@qq.com', joined='1111-11-11', age=11)
Subsciber(addr='111111@qq.com', joined='1111-11-11', age=0)

마지막으로, 그리고 아주 중요한 것은 우리의 목표가 효율적인 데이터 구조를 정의하는 것이라면 앞으로 다양한 인스턴스가 수정될 것이라는 점에 유의해야 합니다. 속성을 사용하는 경우에는 명명된 튜플을 사용하는 것이 최선의 선택이 아닙니다. 대신 __slots__ 속성을 사용하는 클래스를 고려해 볼 수 있습니다.

위 내용은 Python이 이름을 시퀀스 요소(코드)에 매핑하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제