<jupyter_start><jupyter_text>map과 filter 대신 list comprehension을 사용하자Python에는 한 리스트에서 다른 리스트를 만들어내는 간결한 문법이 있다. 이 문법을 사용한 표현식을 `list comprehension`이라고 한다.예를 들어 리스트에 있는 각 숫자의 제곱을 계산 할 때, 다음과 같이 계산식과 루프로 돌릴 입력 시퀀스를 작성해서 수행할 수 있다.<jupyter_code>a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares = [x**2 for x in a]
print(squares)<jupyter_output>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]<jupyter_text>인수가 하나뿐인 함수를 적용하는 상황이 아니면, 간단한 연산에는 list comprehension이 내장 함수 map 보다 명확하다.map 을 쓰려면 계산에 필요한 lambda 함수를 생성해야 해서 깔끔해 보이지 않는다.<jupyter_code>squares = map(lambda x: x ** 2, a)<jupyter_output><empty_output><jupyter_text>map과 달리 list comprehension을 사용하면 입력 리스트에 있는 아이템을 간편하게 걸러내서 그에 대응하는 출력을 결과에서 삭제할 수 있다.예를 들어 2로 나누어 떠렁지는 숫자의 제곱만 계산 시 다음 예에서는 루프 뒤에 조건식을 추가해 계산을 수행한다.<jupyter_code>even_squares = [x**2 for x in a if x % 2 == 0]
print(even_squares)<jupyter_output>[4, 16, 36, 64, 100]<jupyter_text>내장 함수 filter를 map과 연계해서 사용해도 같은 결과를 얻을 수 있지만 읽기 어렵다.<jupyter_code>alt = map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, a))
assert even_squares == list(alt)<jupyter_output><empty_output><jupyter_text>dictionary와 set에도 list comprehension에 해당하는 문법이 있다.comprehension 문법을 쓰면 알고리즘을 작성할 때 파생되는 자료 구조를 쉽게 생성할 수 있다.<jupyter_code>chile_ranks = {'ghost': 1, 'habanero': 2, 'cayenne': 3}
rank_dict = {rank: name for name, rank in chile_ranks.items()}
chile_len_set = {len(name) for name in rank_dict.values()}
print(rank_dict)
print(chile_len_set)<jupyter_output>{1: 'ghost', 2: 'habanero', 3: 'cayenne'}
{8, 5, 7}
{'fraction_non_alphanumeric': 0.11582491582491583, 'fraction_numerical': 0.03838383838383838, 'mean_word_length': 5.090163934426229, 'pattern_counts': {'":': 0, '<': 18, '<?xml version=': 0, '>': 18, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '231800', 'license': 'CNRI-Python', 'n_tokens_mistral': 975, 'n_tokens_neox': 1073, 'n_words': 217, 'path': 'Chap 1: Think as PYTHON/Chap 7 Use list comprehension instead of map or filter.ipynb', 'repo_name': 'HILTON731/Effective-PYTHON', 'size': '1485'}