[{"data":1,"prerenderedAt":885},["ShallowReactive",2],{"blog-\u002Fblog\u002Fpython-comprehensions-explained":3},{"id":4,"title":5,"body":6,"description":871,"difficulty":872,"extension":873,"framework":874,"frameworkSlug":35,"meta":875,"navigation":92,"order":89,"path":876,"qaPath":877,"seo":878,"stem":879,"subtopic":880,"topic":881,"topicSlug":882,"updated":883,"__hash__":884},"blog\u002Fblog\u002Fpython-comprehensions-explained.md","Python Comprehensions Explained — List, Dict, Set, and When Not to Use Them",{"type":7,"value":8,"toc":860},"minimark",[9,14,23,27,30,139,154,158,165,217,227,231,252,312,328,332,343,477,481,491,540,543,610,617,668,675,679,686,710,771,775,782,823,827,856],[10,11,13],"h2",{"id":12},"python-comprehensions-explained","Python comprehensions, explained",[15,16,17,18,22],"p",{},"Comprehensions are one of the first things that make Python code ",[19,20,21],"em",{},"look"," like Python. They\nbuild a collection from an iterable in a single readable expression — but they also get\nabused into write-only one-liners. This guide covers the variants and, just as importantly,\nwhen to stop.",[10,24,26],{"id":25},"the-basic-list-comprehension","The basic list comprehension",[15,28,29],{},"A list comprehension builds a list by transforming each item of an iterable:",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-python shiki shiki-themes github-light github-dark","squares = [x * x for x in range(5)]    # [0, 1, 4, 9, 16]\n\n# equivalent loop:\nsquares = []\nfor x in range(5):\n    squares.append(x * x)\n","python","",[38,39,40,87,94,100,110,128],"code",{"__ignoreMap":36},[41,42,45,49,53,56,59,62,65,67,70,74,77,80,83],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sVt8B","squares ",[41,50,52],{"class":51},"szBVR","=",[41,54,55],{"class":47}," [x ",[41,57,58],{"class":51},"*",[41,60,61],{"class":47}," x ",[41,63,64],{"class":51},"for",[41,66,61],{"class":47},[41,68,69],{"class":51},"in",[41,71,73],{"class":72},"sj4cs"," range",[41,75,76],{"class":47},"(",[41,78,79],{"class":72},"5",[41,81,82],{"class":47},")]    ",[41,84,86],{"class":85},"sJ8bj","# [0, 1, 4, 9, 16]\n",[41,88,90],{"class":43,"line":89},2,[41,91,93],{"emptyLinePlaceholder":92},true,"\n",[41,95,97],{"class":43,"line":96},3,[41,98,99],{"class":85},"# equivalent loop:\n",[41,101,103,105,107],{"class":43,"line":102},4,[41,104,48],{"class":47},[41,106,52],{"class":51},[41,108,109],{"class":47}," []\n",[41,111,113,115,117,119,121,123,125],{"class":43,"line":112},5,[41,114,64],{"class":51},[41,116,61],{"class":47},[41,118,69],{"class":51},[41,120,73],{"class":72},[41,122,76],{"class":47},[41,124,79],{"class":72},[41,126,127],{"class":47},"):\n",[41,129,131,134,136],{"class":43,"line":130},6,[41,132,133],{"class":47},"    squares.append(x ",[41,135,58],{"class":51},[41,137,138],{"class":47}," x)\n",[15,140,141,142,145,146,149,150,153],{},"It's both shorter and slightly faster than the loop, because the iteration and appending\nrun in C. Read it as \"give me ",[38,143,144],{},"x * x"," ",[147,148,64],"strong",{}," each ",[38,151,152],{},"x"," in the range\".",[10,155,157],{"id":156},"filtering-with-a-trailing-if","Filtering with a trailing if",[15,159,160,161,164],{},"Add an ",[38,162,163],{},"if"," at the end to keep only some items:",[31,166,168],{"className":33,"code":167,"language":35,"meta":36,"style":36},"evens = [x for x in range(10) if x % 2 == 0]    # [0, 2, 4, 6, 8]\n",[38,169,170],{"__ignoreMap":36},[41,171,172,175,177,179,181,183,185,187,189,192,195,197,199,202,205,208,211,214],{"class":43,"line":44},[41,173,174],{"class":47},"evens ",[41,176,52],{"class":51},[41,178,55],{"class":47},[41,180,64],{"class":51},[41,182,61],{"class":47},[41,184,69],{"class":51},[41,186,73],{"class":72},[41,188,76],{"class":47},[41,190,191],{"class":72},"10",[41,193,194],{"class":47},") ",[41,196,163],{"class":51},[41,198,61],{"class":47},[41,200,201],{"class":51},"%",[41,203,204],{"class":72}," 2",[41,206,207],{"class":51}," ==",[41,209,210],{"class":72}," 0",[41,212,213],{"class":47},"]    ",[41,215,216],{"class":85},"# [0, 2, 4, 6, 8]\n",[15,218,219,220,222,223,226],{},"This ",[38,221,163],{}," is a ",[147,224,225],{},"filter"," — items that fail are skipped entirely.",[10,228,230],{"id":229},"conditional-transform-with-a-leading-ifelse","Conditional transform with a leading if\u002Felse",[15,232,233,234,236,237,240,241,244,245,248,249,251],{},"Don't confuse the filter ",[38,235,163],{}," with a conditional ",[19,238,239],{},"expression",". To choose between two values,\nthe ",[38,242,243],{},"if\u002Felse"," goes ",[147,246,247],{},"before"," the ",[38,250,64],{}," (it's a ternary on the output):",[31,253,255],{"className":33,"code":254,"language":35,"meta":36,"style":36},"labels = [\"even\" if x % 2 == 0 else \"odd\" for x in range(4)]\n# ['even', 'odd', 'even', 'odd']\n",[38,256,257,307],{"__ignoreMap":36},[41,258,259,262,264,267,271,274,276,278,280,282,284,287,290,293,295,297,299,301,304],{"class":43,"line":44},[41,260,261],{"class":47},"labels ",[41,263,52],{"class":51},[41,265,266],{"class":47}," [",[41,268,270],{"class":269},"sZZnC","\"even\"",[41,272,273],{"class":51}," if",[41,275,61],{"class":47},[41,277,201],{"class":51},[41,279,204],{"class":72},[41,281,207],{"class":51},[41,283,210],{"class":72},[41,285,286],{"class":51}," else",[41,288,289],{"class":269}," \"odd\"",[41,291,292],{"class":51}," for",[41,294,61],{"class":47},[41,296,69],{"class":51},[41,298,73],{"class":72},[41,300,76],{"class":47},[41,302,303],{"class":72},"4",[41,305,306],{"class":47},")]\n",[41,308,309],{"class":43,"line":89},[41,310,311],{"class":85},"# ['even', 'odd', 'even', 'odd']\n",[15,313,314,315,317,318,321,322,317,324,327],{},"Rule of thumb: ",[38,316,163],{}," at the ",[147,319,320],{},"end"," filters; ",[38,323,243],{},[147,325,326],{},"front"," transforms.",[10,329,331],{"id":330},"dict-and-set-comprehensions","Dict and set comprehensions",[15,333,334,335,338,339,342],{},"The same syntax builds dicts (with ",[38,336,337],{},"key: value",") and sets (with ",[38,340,341],{},"{}"," and no colon):",[31,344,346],{"className":33,"code":345,"language":35,"meta":36,"style":36},"squares = {x: x * x for x in range(4)}      # {0: 0, 1: 1, 2: 4, 3: 9}  — dict\nunique = {x % 3 for x in range(10)}         # {0, 1, 2}                 — set\n\n# invert a dict\nprices = {\"a\": 1, \"b\": 2}\nby_price = {v: k for k, v in prices.items()}   # {1: 'a', 2: 'b'}\n",[38,347,348,379,412,416,421,454],{"__ignoreMap":36},[41,349,350,352,354,357,359,361,363,365,367,369,371,373,376],{"class":43,"line":44},[41,351,48],{"class":47},[41,353,52],{"class":51},[41,355,356],{"class":47}," {x: x ",[41,358,58],{"class":51},[41,360,61],{"class":47},[41,362,64],{"class":51},[41,364,61],{"class":47},[41,366,69],{"class":51},[41,368,73],{"class":72},[41,370,76],{"class":47},[41,372,303],{"class":72},[41,374,375],{"class":47},")}      ",[41,377,378],{"class":85},"# {0: 0, 1: 1, 2: 4, 3: 9}  — dict\n",[41,380,381,384,386,389,391,394,396,398,400,402,404,406,409],{"class":43,"line":89},[41,382,383],{"class":47},"unique ",[41,385,52],{"class":51},[41,387,388],{"class":47}," {x ",[41,390,201],{"class":51},[41,392,393],{"class":72}," 3",[41,395,292],{"class":51},[41,397,61],{"class":47},[41,399,69],{"class":51},[41,401,73],{"class":72},[41,403,76],{"class":47},[41,405,191],{"class":72},[41,407,408],{"class":47},")}         ",[41,410,411],{"class":85},"# {0, 1, 2}                 — set\n",[41,413,414],{"class":43,"line":96},[41,415,93],{"emptyLinePlaceholder":92},[41,417,418],{"class":43,"line":102},[41,419,420],{"class":85},"# invert a dict\n",[41,422,423,426,428,431,434,437,440,443,446,448,451],{"class":43,"line":112},[41,424,425],{"class":47},"prices ",[41,427,52],{"class":51},[41,429,430],{"class":47}," {",[41,432,433],{"class":269},"\"a\"",[41,435,436],{"class":47},": ",[41,438,439],{"class":72},"1",[41,441,442],{"class":47},", ",[41,444,445],{"class":269},"\"b\"",[41,447,436],{"class":47},[41,449,450],{"class":72},"2",[41,452,453],{"class":47},"}\n",[41,455,456,459,461,464,466,469,471,474],{"class":43,"line":130},[41,457,458],{"class":47},"by_price ",[41,460,52],{"class":51},[41,462,463],{"class":47}," {v: k ",[41,465,64],{"class":51},[41,467,468],{"class":47}," k, v ",[41,470,69],{"class":51},[41,472,473],{"class":47}," prices.items()}   ",[41,475,476],{"class":85},"# {1: 'a', 2: 'b'}\n",[10,478,480],{"id":479},"nested-comprehensions","Nested comprehensions",[15,482,483,484,490],{},"You can iterate multiple loops in one comprehension. The clauses read ",[147,485,486,487,489],{},"left to right, in\nthe same order as nested ",[38,488,64],{}," loops",":",[31,492,494],{"className":33,"code":493,"language":35,"meta":36,"style":36},"pairs = [(x, y) for x in range(2) for y in range(2)]\n# [(0, 0), (0, 1), (1, 0), (1, 1)]\n",[38,495,496,535],{"__ignoreMap":36},[41,497,498,501,503,506,508,510,512,514,516,518,520,522,525,527,529,531,533],{"class":43,"line":44},[41,499,500],{"class":47},"pairs ",[41,502,52],{"class":51},[41,504,505],{"class":47}," [(x, y) ",[41,507,64],{"class":51},[41,509,61],{"class":47},[41,511,69],{"class":51},[41,513,73],{"class":72},[41,515,76],{"class":47},[41,517,450],{"class":72},[41,519,194],{"class":47},[41,521,64],{"class":51},[41,523,524],{"class":47}," y ",[41,526,69],{"class":51},[41,528,73],{"class":72},[41,530,76],{"class":47},[41,532,450],{"class":72},[41,534,306],{"class":47},[41,536,537],{"class":43,"line":89},[41,538,539],{"class":85},"# [(0, 0), (0, 1), (1, 0), (1, 1)]\n",[15,541,542],{},"Flattening a list of lists is a common case:",[31,544,546],{"className":33,"code":545,"language":35,"meta":36,"style":36},"matrix = [[1, 2], [3, 4]]\nflat = [n for row in matrix for n in row]    # [1, 2, 3, 4]\n",[38,547,548,577],{"__ignoreMap":36},[41,549,550,553,555,558,560,562,564,567,570,572,574],{"class":43,"line":44},[41,551,552],{"class":47},"matrix ",[41,554,52],{"class":51},[41,556,557],{"class":47}," [[",[41,559,439],{"class":72},[41,561,442],{"class":47},[41,563,450],{"class":72},[41,565,566],{"class":47},"], [",[41,568,569],{"class":72},"3",[41,571,442],{"class":47},[41,573,303],{"class":72},[41,575,576],{"class":47},"]]\n",[41,578,579,582,584,587,589,592,594,597,599,602,604,607],{"class":43,"line":89},[41,580,581],{"class":47},"flat ",[41,583,52],{"class":51},[41,585,586],{"class":47}," [n ",[41,588,64],{"class":51},[41,590,591],{"class":47}," row ",[41,593,69],{"class":51},[41,595,596],{"class":47}," matrix ",[41,598,64],{"class":51},[41,600,601],{"class":47}," n ",[41,603,69],{"class":51},[41,605,606],{"class":47}," row]    ",[41,608,609],{"class":85},"# [1, 2, 3, 4]\n",[15,611,612,613,616],{},"A ",[19,614,615],{},"nested"," comprehension (a comprehension inside the output) builds nested structures:",[31,618,620],{"className":33,"code":619,"language":35,"meta":36,"style":36},"grid = [[0 for _ in range(3)] for _ in range(2)]   # 2x3 grid\n",[38,621,622],{"__ignoreMap":36},[41,623,624,627,629,631,634,636,639,641,643,645,647,650,652,654,656,658,660,662,665],{"class":43,"line":44},[41,625,626],{"class":47},"grid ",[41,628,52],{"class":51},[41,630,557],{"class":47},[41,632,633],{"class":72},"0",[41,635,292],{"class":51},[41,637,638],{"class":47}," _ ",[41,640,69],{"class":51},[41,642,73],{"class":72},[41,644,76],{"class":47},[41,646,569],{"class":72},[41,648,649],{"class":47},")] ",[41,651,64],{"class":51},[41,653,638],{"class":47},[41,655,69],{"class":51},[41,657,73],{"class":72},[41,659,76],{"class":47},[41,661,450],{"class":72},[41,663,664],{"class":47},")]   ",[41,666,667],{"class":85},"# 2x3 grid\n",[15,669,670,671,674],{},"Note: build the grid this way, not with ",[38,672,673],{},"[[0] * 3] * 2",", which shares the inner list across\nrows.",[10,676,678],{"id":677},"when-not-to-use-a-comprehension","When NOT to use a comprehension",[15,680,681,682,685],{},"Comprehensions are for ",[147,683,684],{},"building a collection",". Reach for a plain loop when:",[687,688,689,697,704],"ul",{},[690,691,692,693,696],"li",{},"You're acting for ",[147,694,695],{},"side effects"," (printing, writing to a file) — don't build a throwaway\nlist just to loop.",[690,698,699,700,703],{},"The logic needs ",[38,701,702],{},"try\u002Fexcept",", multiple statements, or several conditions — it stops being\nreadable.",[690,705,706,707,709],{},"It would be deeply nested — two ",[38,708,64],{}," clauses is usually the readability limit.",[31,711,713],{"className":33,"code":712,"language":35,"meta":36,"style":36},"# Don't do this — comprehension used only for side effects:\n[print(x) for x in items]      # builds a useless list of Nones\n\n# Just loop:\nfor x in items:\n    print(x)\n",[38,714,715,720,743,747,752,763],{"__ignoreMap":36},[41,716,717],{"class":43,"line":44},[41,718,719],{"class":85},"# Don't do this — comprehension used only for side effects:\n",[41,721,722,725,728,731,733,735,737,740],{"class":43,"line":89},[41,723,724],{"class":47},"[",[41,726,727],{"class":72},"print",[41,729,730],{"class":47},"(x) ",[41,732,64],{"class":51},[41,734,61],{"class":47},[41,736,69],{"class":51},[41,738,739],{"class":47}," items]      ",[41,741,742],{"class":85},"# builds a useless list of Nones\n",[41,744,745],{"class":43,"line":96},[41,746,93],{"emptyLinePlaceholder":92},[41,748,749],{"class":43,"line":102},[41,750,751],{"class":85},"# Just loop:\n",[41,753,754,756,758,760],{"class":43,"line":112},[41,755,64],{"class":51},[41,757,61],{"class":47},[41,759,69],{"class":51},[41,761,762],{"class":47}," items:\n",[41,764,765,768],{"class":43,"line":130},[41,766,767],{"class":72},"    print",[41,769,770],{"class":47},"(x)\n",[10,772,774],{"id":773},"generator-expressions-for-large-data","Generator expressions for large data",[15,776,777,778,781],{},"If you only need to iterate once, a ",[147,779,780],{},"generator expression"," (parentheses instead of\nbrackets) avoids building the whole list in memory:",[31,783,785],{"className":33,"code":784,"language":35,"meta":36,"style":36},"total = sum(x * x for x in range(1_000_000))   # lazy — no giant list\n",[38,786,787],{"__ignoreMap":36},[41,788,789,792,794,797,800,802,804,806,808,810,812,814,817,820],{"class":43,"line":44},[41,790,791],{"class":47},"total ",[41,793,52],{"class":51},[41,795,796],{"class":72}," sum",[41,798,799],{"class":47},"(x ",[41,801,58],{"class":51},[41,803,61],{"class":47},[41,805,64],{"class":51},[41,807,61],{"class":47},[41,809,69],{"class":51},[41,811,73],{"class":72},[41,813,76],{"class":47},[41,815,816],{"class":72},"1_000_000",[41,818,819],{"class":47},"))   ",[41,821,822],{"class":85},"# lazy — no giant list\n",[10,824,826],{"id":825},"recap","Recap",[15,828,829,830,832,835,836,145,838,841,842,845,846,849,850,852,853,855],{},"A comprehension builds a collection from an iterable in one expression: a trailing ",[38,831,163],{},[147,833,834],{},"filters",", while a leading ",[38,837,243],{},[147,839,840],{},"transforms",". The same syntax produces dicts\n(",[38,843,844],{},"{k: v ...}",") and sets (",[38,847,848],{},"{x ...}","), and multiple ",[38,851,64],{}," clauses read left-to-right for\nnesting and flattening. Skip the comprehension when you're looping for side effects or when\nthe logic gets complex — and use a parenthesised ",[147,854,780],{}," when the data is\nlarge and you only iterate once.",[857,858,859],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":36,"searchDepth":89,"depth":89,"links":861},[862,863,864,865,866,867,868,869,870],{"id":12,"depth":89,"text":13},{"id":25,"depth":89,"text":26},{"id":156,"depth":89,"text":157},{"id":229,"depth":89,"text":230},{"id":330,"depth":89,"text":331},{"id":479,"depth":89,"text":480},{"id":677,"depth":89,"text":678},{"id":773,"depth":89,"text":774},{"id":825,"depth":89,"text":826},"How Python comprehensions work — filtering and conditional transforms, nested comprehensions, dict and set comprehensions, and when a plain loop is the better choice.","easy","md","Python",{},"\u002Fblog\u002Fpython-comprehensions-explained","\u002Fpython\u002Fiteration\u002Fcomprehensions",{"title":5,"description":871},"blog\u002Fpython-comprehensions-explained","List, Dict & Set Comprehensions","Comprehensions & Iteration","iteration","2026-06-19","6wvMpCRiZyeLwQ3axp1fkoyiFlCRDrownMadrgS96a0",1782244092802]