일반적인 Python 표준 라이브러리 기능의 드문 사용


저자의 이미지 | 표의 문자
틀 소개
Python 표준 라이브러리의 기본 사항을 알고 있습니다. 당신은 아마도 같은 기능을 사용했을 것입니다 zip()
그리고 groupby()
소란없이 일상적인 작업을 처리합니다. 그러나 대부분의 개발자들이 놓친 내용은 다음과 같습니다.이 같은 기능은 아마도 고려하지 않은 방식으로 놀랍게도 “드문”문제를 해결할 수 있습니다. 이 기사에서는 친숙한 파이썬 기능의 일부 사용에 대해 설명합니다.
🔗 Github의 코드 링크
틀 1. itertools.groupby()
런 길이 인코딩 용
대부분의 개발자는 생각합니다 groupby()
데이터를 논리적으로 그룹화하기위한 간단한 도구로서, 동일한 요소를 연속적으로 계산하는 압축 기술인 런 길이 인코딩에도 유용합니다. 이 기능은 자연스럽게 일치하는 항목을 함께 그룹화하므로 반복 시퀀스를 소형 표현으로 변환 할 수 있습니다.
from itertools import groupby
# Analyze user activity patterns from server logs
user_actions = ['login', 'login', 'browse', 'browse', 'browse',
'purchase', 'logout', 'logout']
# Compress into pattern summary
activity_patterns = [(action, len(list(group)))
for action, group in groupby(user_actions)]
print(activity_patterns)
# Calculate total time spent in each activity phase
total_duration = sum(count for action, count in activity_patterns)
print(f"Session lasted {total_duration} actions")
산출:
[('login', 2), ('browse', 3), ('purchase', 1), ('logout', 2)]
Session lasted 8 actions
그만큼 groupby()
함수는 연속 동일한 요소를 식별하고 함께 그룹화합니다. 각 그룹을 목록으로 변환하고 길이를 측정함으로써 각 동작이 순서대로 몇 번이나 발생했는지를 얻습니다.
틀 2. zip()
매트릭스 전위를 위해 *
매트릭스 전송 – 열을 열로 뒤집는 것 – 결합하면 간단 해집니다. zip()
Python의 포장 풀기 연산자와 함께.
포장 풀기 연산자 (*
) 매트릭스 행을 개별 인수로 확산시킵니다 zip()
그런 다음 각 행에서 해당 요소를 가져 와서 다시 조립합니다.
# Quarterly sales data organized by product lines
quarterly_sales = [
[120, 135, 148, 162], # Product A by quarter
[95, 102, 118, 125], # Product B by quarter
[87, 94, 101, 115] # Product C by quarter
]
# Transform to quarterly view across all products
by_quarter = list(zip(*quarterly_sales))
print("Sales by quarter:", by_quarter)
# Calculate quarterly growth rates
quarterly_totals = [sum(quarter) for quarter in by_quarter]
growth_rates = [(quarterly_totals[i] - quarterly_totals[i-1]) / quarterly_totals[i-1] * 100
for i in range(1, len(quarterly_totals))]
print(f"Growth rates: {[f'{rate:.1f}%' for rate in growth_rates]}")
산출:
Sales by quarter: [(120, 95, 87), (135, 102, 94), (148, 118, 101), (162, 125, 115)]
Growth rates: ['9.6%', '10.9%', '9.5%']
목록을 먼저 풀고 다음과 같습니다 zip()
함수는 각 목록에서 첫 번째 요소를 그룹화 한 다음 두 번째 요소 등을 그룹화합니다.
틀 3. bisect
정렬 된 순서를 유지하기 위해
새로운 요소를 추가 할 때 데이터를 정렬 유지하려면 일반적으로 비싼 재 분류 작업이 필요하지만 이등분 모듈은 이진 검색 알고리즘을 사용하여 순서를 자동으로 유지합니다.
이 모듈에는 로그 시간의 새로운 요소에 대한 정확한 삽입 지점을 찾는 데 도움이되는 기능이 있습니다. 그런 다음 기존 순서를 방해하지 않고 올바르게 배치합니다.
import bisect
# Maintain a high-score leaderboard that stays sorted
class Leaderboard:
def __init__(self):
self.scores = []
self.players = []
def add_score(self, player, score):
# Insert maintaining descending order
pos = bisect.bisect_left([-s for s in self.scores], -score)
self.scores.insert(pos, score)
self.players.insert(pos, player)
def top_players(self, n=5):
return list(zip(self.players[:n], self.scores[:n]))
# Demo the leaderboard
board = Leaderboard()
scores = [("Alice", 2850), ("Bob", 3100), ("Carol", 2650),
("David", 3350), ("Eva", 2900)]
for player, score in scores:
board.add_score(player, score)
print("Top 3 players:", board.top_players(3))
산출:
Top 3 players: [('David', 3350), ('Bob', 3100), ('Eva', 2900)]
이는 리더 보드, 우선 순위 대기열 또는 시간이 지남에 따라 점진적으로 성장하는 주문 컬렉션을 유지하는 데 유용합니다.
틀 4. heapq
완전한 정렬없이 극단을 찾는 것
데이터 세트에서 가장 크거나 작은 요소 만 필요하면 전체 정렬이 비효율적입니다. 그만큼 Heapq 모듈은 힙 데이터 구조를 사용하여 모든 것을 정렬하지 않고도 극한 값을 효율적으로 추출합니다.
import heapq
# Analyze customer satisfaction survey results
survey_responses = [
("Restaurant A", 4.8), ("Restaurant B", 3.2), ("Restaurant C", 4.9),
("Restaurant D", 2.1), ("Restaurant E", 4.7), ("Restaurant F", 1.8),
("Restaurant G", 4.6), ("Restaurant H", 3.8), ("Restaurant I", 4.4),
("Restaurant J", 2.9), ("Restaurant K", 4.2), ("Restaurant L", 3.5)
]
# Find top performers and underperformers without full sorting
top_rated = heapq.nlargest(3, survey_responses, key=lambda x: x[1])
worst_rated = heapq.nsmallest(3, survey_responses, key=lambda x: x[1])
print("Excellence awards:", [name for name, rating in top_rated])
print("Needs improvement:", [name for name, rating in worst_rated])
# Calculate performance spread
best_score = top_rated[0][1]
worst_score = worst_rated[0][1]
print(f"Performance range: {worst_score} to {best_score} ({best_score - worst_score:.1f} point spread)")
산출:
Excellence awards: ['Restaurant C', 'Restaurant A', 'Restaurant E']
Needs improvement: ['Restaurant F', 'Restaurant D', 'Restaurant J']
Performance range: 1.8 to 4.9 (3.1 point spread)
힙 알고리즘은 모든 데이터를 구성하지 않고 극단적 인 값을 효율적으로 추적하는 부분 순서를 유지합니다.
틀 5. operator.itemgetter
다중 레벨 분류 용
복잡한 분류 요구 사항은 종종 복잡한 람다 표현식 또는 중첩 조건부 논리로 이어집니다. 하지만 operator.itemgetter
다중 기준 분류를위한 우아한 솔루션을 제공합니다.
이 기능은 데이터 구조에서 여러 값을 가져 오는 주요 추출기를 생성하여 Python의 자연 튜플 분류가 복잡한 순서 로직을 처리 할 수 있도록합니다.
from operator import itemgetter
# Employee performance data: (name, department, performance_score, hire_date)
employees = [
("Sarah", "Engineering", 94, "2022-03-15"),
("Mike", "Sales", 87, "2021-07-22"),
("Jennifer", "Engineering", 91, "2020-11-08"),
("Carlos", "Marketing", 89, "2023-01-10"),
("Lisa", "Sales", 92, "2022-09-03"),
("David", "Engineering", 88, "2021-12-14"),
("Amanda", "Marketing", 95, "2020-05-18")
]
sorted_employees = sorted(employees, key=itemgetter(1, 2))
# For descending performance within department:
dept_performance_sorted = sorted(employees, key=lambda x: (x[1], -x[2]))
print("Department performance rankings:")
current_dept = None
for name, dept, score, hire_date in dept_performance_sorted:
if dept != current_dept:
print(f"\n{dept} Department:")
current_dept = dept
print(f" {name}: {score}/100")
산출:
Department performance rankings:
Engineering Department:
Sarah: 94/100
Jennifer: 91/100
David: 88/100
Marketing Department:
Amanda: 95/100
Carlos: 89/100
Sales Department:
Lisa: 92/100
Mike: 87/100
그만큼 itemgetter(1, 2)
함수는 각 튜플에서 부서 및 성능 점수를 추출하여 복합 분류 키를 만듭니다. Python의 튜플 비교는 첫 번째 요소 (부서)에 의해 자연스럽게 분류 된 다음 부서와 일치하는 항목의 두 번째 요소 (점수)에 의해 분류됩니다.
틀 6. collections.defaultdict
데이터 구조를 즉시 구축합니다
복잡한 중첩 데이터 구조를 만들려면 일반적으로 값을 추가하기 전에 지루한 존재 검사가 필요하므로 실제 논리를 가리는 반복 조건부 코드로 이어집니다.
그만큼 defaultdict
지정한 팩토리 기능을 사용하여 결 측값을 자동으로 생성 하여이 오버 헤드를 제거합니다.
from collections import defaultdict
books_data = [
("1984", "George Orwell", "Dystopian Fiction", 1949),
("Dune", "Frank Herbert", "Science Fiction", 1965),
("Pride and Prejudice", "Jane Austen", "Romance", 1813),
("The Hobbit", "J.R.R. Tolkien", "Fantasy", 1937),
("Foundation", "Isaac Asimov", "Science Fiction", 1951),
("Emma", "Jane Austen", "Romance", 1815)
]
# Create multiple indexes simultaneously
catalog = {
'by_author': defaultdict(list),
'by_genre': defaultdict(list),
'by_decade': defaultdict(list)
}
for title, author, genre, year in books_data:
catalog['by_author']Bala Priya C.append((title, year))
catalog['by_genre'][genre].append((title, author))
catalog['by_decade'][year // 10 * 10].append((title, author))
# Query the catalog
print("Jane Austen books:", dict(catalog['by_author'])['Jane Austen'])
print("Science Fiction titles:", len(catalog['by_genre']['Science Fiction']))
print("1960s publications:", dict(catalog['by_decade']).get(1960, []))
산출:
Jane Austen books: [('Pride and Prejudice', 1813), ('Emma', 1815)]
Science Fiction titles: 2
1960s publications: [('Dune', 'Frank Herbert')]
그만큼 defaultdict(list)
액세스하는 새로운 키에 대한 빈 목록을 자동으로 생성하여 확인이 필요하지 않습니다. if key not in dictionary
값을 추가하기 전에.
틀 7. string.Template
안전한 문자열 형식의 경우
F- 스트링과 같은 표준 문자열 서식 메소드 .format()
예상 변수가 누락되면 실패합니다. 하지만 string.Template
불완전한 데이터로도 코드를 계속 실행합니다. 템플릿 시스템은 정의되지 않은 변수를 충돌시키지 않고 제자리에 남겨 둡니다.
from string import Template
report_template = Template("""
=== SYSTEM PERFORMANCE REPORT ===
Generated: $timestamp
Server: $server_name
CPU Usage: $cpu_usage%
Memory Usage: $memory_usage%
Disk Space: $disk_usage%
Active Connections: $active_connections
Error Rate: $error_rate%
${detailed_metrics}
Status: $overall_status
Next Check: $next_check_time
""")
# Simulate partial monitoring data (some sensors might be offline)
monitoring_data = {
'timestamp': '2024-01-15 14:30:00',
'server_name': 'web-server-01',
'cpu_usage': '23.4',
'memory_usage': '67.8',
# Missing: disk_usage, active_connections, error_rate, detailed_metrics
'overall_status': 'OPERATIONAL',
'next_check_time': '15:30:00'
}
# Generate report with available data, leaving gaps for missing info
report = report_template.safe_substitute(monitoring_data)
print(report)
# Output shows available data filled in, missing variables left as $placeholders
print("\n" + "="*50)
print("Missing data can be filled in later:")
additional_data = {'disk_usage': '45.2', 'error_rate': '0.1'}
updated_report = Template(report).safe_substitute(additional_data)
print("Disk usage now shows:", "45.2%" in updated_report)
산출:
=== SYSTEM PERFORMANCE REPORT ===
Generated: 2024-01-15 14:30:00
Server: web-server-01
CPU Usage: 23.4%
Memory Usage: 67.8%
Disk Space: $disk_usage%
Active Connections: $active_connections
Error Rate: $error_rate%
${detailed_metrics}
Status: OPERATIONAL
Next Check: 15:30:00
==================================================
Missing data can be filled in later:
Disk usage now shows: True
그만큼 safe_substitute()
방법 프로세스 사용 가능한 변수는 나중에 완료하기 위해 정의되지 않은 자리 표시자를 보존합니다. 이것은 부분 데이터가 완전한 실패보다는 의미있는 부분 결과를 생성하는 결함 내성 시스템을 생성합니다.
이 접근법은 구성 관리, 보고서 생성, 이메일 템플릿 또는 데이터가 점진적으로 도착하거나 일시적으로 사용할 수없는 시스템에 유용합니다.
틀 결론
Python Standard Library에는 해결할 수있는 문제에 대한 솔루션이 포함되어 있습니다. 여기서 논의한 것은 친숙한 기능이 비 사소한 작업을 처리 할 수있는 방법을 보여줍니다.
다음에 사용자 정의 기능 작성을 시작하면 이미 사용 가능한 것을 일시 중지하고 탐색하십시오. Python Standard Library의 도구는 종종 더 빠르고 신뢰할 수 있으며 추가 설정이 필요한 우아한 솔루션을 제공합니다.
행복한 코딩!
발라 프리 야 c 인도의 개발자이자 기술 작가입니다. 그녀는 수학, 프로그래밍, 데이터 과학 및 컨텐츠 제작의 교차점에서 일하는 것을 좋아합니다. 그녀의 관심 분야와 전문 지식에는 DevOps, 데이터 과학 및 자연어 처리가 포함됩니다. 그녀는 독서, 쓰기, 코딩 및 커피를 즐깁니다! 현재 그녀는 자습서, 방법 안내, 의견 조각 등을 통해 개발자 커뮤니티와 지식을 배우고 공유하는 작업을하고 있습니다. Bala는 또한 매력적인 리소스 개요 및 코딩 자습서를 만듭니다.
Post Comment