{"id":689,"date":"2021-12-19T19:53:47","date_gmt":"2021-12-19T19:53:47","guid":{"rendered":"https:\/\/www.allendowney.com\/blog\/?p=689"},"modified":"2021-12-19T19:53:47","modified_gmt":"2021-12-19T19:53:47","slug":"data-structures-and-information-retrieval-in-python","status":"publish","type":"post","link":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/","title":{"rendered":"Data Structures and Information Retrieval in Python"},"content":{"rendered":"\n<p>I am happy to announce the first release of a new book, <em><a href=\"https:\/\/allendowney.github.io\/DSIRP\">Data Structures and Information Retrieval in Python<\/a><\/em>, which is an introduction to data structures organized around a motivating example: building a search engine.<\/p>\n\n\n\n<p>The elements of the search engine are the Crawler, which downloads web pages and follows links to other pages, the Indexer, which builds a map from each word to the pages where it appears, and the Retriever, which looks up search terms and finds pages that maximize relevance and quality.<\/p>\n\n\n\n<p>The index is stored in Redis, which is a NoSQL database that provides data structures like sets, lists, and hashmaps. The book presents each data structure first in Python, then in Redis, which should help readers see which features are essential and which are implementation details.<\/p>\n\n\n\n<p>The book is loosely based on <em><a href=\"https:\/\/greenteapress.com\/wp\/think-data-structures\/\">Think Data Structures<\/a><\/em>, which uses Java. When I started, I thought it would be a translation, but the changes were so pervasive, I ended up writing it from scratch.<\/p>\n\n\n\n<p>As I did with <em><a href=\"https:\/\/greenteapress.com\/wp\/think-bayes\/\">Think Bayes<\/a><\/em>, I wrote this book entirely in Jupyter notebooks, and used <a href=\"https:\/\/jupyterbook.org\/intro.html\">JupyterBook<\/a> to translate them to HTML. The notebooks run on Colab, which is a service provided by Google that runs notebooks in a browser. So you can read the book, run the code, and work on exercises without installing anything.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why?<\/h2>\n\n\n\n<p>I have mixed feelings about data structures. In the computer science curriculum, it is often used as a weed-out class, and in the technical interview process, it is used as a gatekeeper. In both cases, it plays a disproportionate role in determining who studies computer science and who gets jobs in the field.<\/p>\n\n\n\n<p>And it tends to be a bad class. The material is presented theoretically, without context or application, organized in a way that seems designed to maximize tedium, and often taught badly. The goals of the course are ambiguous &#8212; is it about theoretical foundations or programming proficiency? &#8212; and the result is often a hybrid that does nothing well.<\/p>\n\n\n\n<p>Also, it has not kept up with changes in the software landscape. When people were learning to program in C, it might have been appropriate to focus on the implementation of data structures. But for people learning Python, it&#8217;s probably better to learn how to use them first, and see how they are implemented when (and if) necessary.<\/p>\n\n\n\n<p>Despite my misgivings about the material, in 2016 I found myself designing a data structures curriculum for the Flatiron School, on behalf of a large software company. In 2017 I updated the curriculum and published <em>Think Data Structures<\/em>. But the software curriculum at Olin uses more Python than Java, so I have not used the Java version in a class.<\/p>\n\n\n\n<p>Since I was scheduled to teach Data Structures this fall, I decided to write a Python version. I started last August with an outline and about 10 notebooks in various stages of completion. I developed the rest of the material during the semester, staying about a week ahead of the students.<\/p>\n\n\n\n<p>Now there are 29 notebooks including 22 that present the material and 7 quizzes that include practice questions. I hope people will find it useful!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I am happy to announce the first release of a new book, Data Structures and Information Retrieval in Python, which is an introduction to data structures organized around a motivating example: building a search engine. The elements of the search engine are the Crawler, which downloads web pages and follows links to other pages, the Indexer, which builds a map from each word to the pages where it appears, and the Retriever, which looks up search terms and finds pages&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[91,90,16],"class_list":["post-689","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-computer-science","tag-data-structures","tag-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Data Structures and Information Retrieval in Python - Probably Overthinking It<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Data Structures and Information Retrieval in Python - Probably Overthinking It\" \/>\n<meta property=\"og:description\" content=\"I am happy to announce the first release of a new book, Data Structures and Information Retrieval in Python, which is an introduction to data structures organized around a motivating example: building a search engine. The elements of the search engine are the Crawler, which downloads web pages and follows links to other pages, the Indexer, which builds a map from each word to the pages where it appears, and the Retriever, which looks up search terms and finds pages... Read More Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Probably Overthinking It\" \/>\n<meta property=\"article:published_time\" content=\"2021-12-19T19:53:47+00:00\" \/>\n<meta name=\"author\" content=\"AllenDowney\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@AllenDowney\" \/>\n<meta name=\"twitter:site\" content=\"@AllenDowney\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"AllenDowney\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/\"},\"author\":{\"name\":\"AllenDowney\",\"@id\":\"https:\/\/www.allendowney.com\/blog\/#\/schema\/person\/4e5bfb2e9af6c3446cb0031a7bf83207\"},\"headline\":\"Data Structures and Information Retrieval in Python\",\"datePublished\":\"2021-12-19T19:53:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/\"},\"wordCount\":531,\"publisher\":{\"@id\":\"https:\/\/www.allendowney.com\/blog\/#organization\"},\"keywords\":[\"computer science\",\"data structures\",\"python\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/\",\"url\":\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/\",\"name\":\"Data Structures and Information Retrieval in Python - Probably Overthinking It\",\"isPartOf\":{\"@id\":\"https:\/\/www.allendowney.com\/blog\/#website\"},\"datePublished\":\"2021-12-19T19:53:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.allendowney.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data Structures and Information Retrieval in Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.allendowney.com\/blog\/#website\",\"url\":\"https:\/\/www.allendowney.com\/blog\/\",\"name\":\"Probably Overthinking It\",\"description\":\"Data science, Bayesian Statistics, and other ideas\",\"publisher\":{\"@id\":\"https:\/\/www.allendowney.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.allendowney.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.allendowney.com\/blog\/#organization\",\"name\":\"Probably Overthinking It\",\"url\":\"https:\/\/www.allendowney.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.allendowney.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.allendowney.com\/blog\/wp-content\/uploads\/2025\/03\/probably_logo.png\",\"contentUrl\":\"https:\/\/www.allendowney.com\/blog\/wp-content\/uploads\/2025\/03\/probably_logo.png\",\"width\":714,\"height\":784,\"caption\":\"Probably Overthinking It\"},\"image\":{\"@id\":\"https:\/\/www.allendowney.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/AllenDowney\",\"https:\/\/www.linkedin.com\/in\/allendowney\/\",\"https:\/\/bsky.app\/profile\/allendowney.bsky.social\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.allendowney.com\/blog\/#\/schema\/person\/4e5bfb2e9af6c3446cb0031a7bf83207\",\"name\":\"AllenDowney\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.allendowney.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/fb01b3a7f7190bea1bbf7f0852e686c2f8c03b099222df2ce4bc7926f15bcb43?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/fb01b3a7f7190bea1bbf7f0852e686c2f8c03b099222df2ce4bc7926f15bcb43?s=96&d=mm&r=g\",\"caption\":\"AllenDowney\"},\"url\":\"https:\/\/www.allendowney.com\/blog\/author\/allendowney_6dbrc4\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Data Structures and Information Retrieval in Python - Probably Overthinking It","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/","og_locale":"en_US","og_type":"article","og_title":"Data Structures and Information Retrieval in Python - Probably Overthinking It","og_description":"I am happy to announce the first release of a new book, Data Structures and Information Retrieval in Python, which is an introduction to data structures organized around a motivating example: building a search engine. The elements of the search engine are the Crawler, which downloads web pages and follows links to other pages, the Indexer, which builds a map from each word to the pages where it appears, and the Retriever, which looks up search terms and finds pages... Read More Read More","og_url":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/","og_site_name":"Probably Overthinking It","article_published_time":"2021-12-19T19:53:47+00:00","author":"AllenDowney","twitter_card":"summary_large_image","twitter_creator":"@AllenDowney","twitter_site":"@AllenDowney","twitter_misc":{"Written by":"AllenDowney","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/#article","isPartOf":{"@id":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/"},"author":{"name":"AllenDowney","@id":"https:\/\/www.allendowney.com\/blog\/#\/schema\/person\/4e5bfb2e9af6c3446cb0031a7bf83207"},"headline":"Data Structures and Information Retrieval in Python","datePublished":"2021-12-19T19:53:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/"},"wordCount":531,"publisher":{"@id":"https:\/\/www.allendowney.com\/blog\/#organization"},"keywords":["computer science","data structures","python"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/","url":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/","name":"Data Structures and Information Retrieval in Python - Probably Overthinking It","isPartOf":{"@id":"https:\/\/www.allendowney.com\/blog\/#website"},"datePublished":"2021-12-19T19:53:47+00:00","breadcrumb":{"@id":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.allendowney.com\/blog\/2021\/12\/19\/data-structures-and-information-retrieval-in-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.allendowney.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Data Structures and Information Retrieval in Python"}]},{"@type":"WebSite","@id":"https:\/\/www.allendowney.com\/blog\/#website","url":"https:\/\/www.allendowney.com\/blog\/","name":"Probably Overthinking It","description":"Data science, Bayesian Statistics, and other ideas","publisher":{"@id":"https:\/\/www.allendowney.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.allendowney.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.allendowney.com\/blog\/#organization","name":"Probably Overthinking It","url":"https:\/\/www.allendowney.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.allendowney.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.allendowney.com\/blog\/wp-content\/uploads\/2025\/03\/probably_logo.png","contentUrl":"https:\/\/www.allendowney.com\/blog\/wp-content\/uploads\/2025\/03\/probably_logo.png","width":714,"height":784,"caption":"Probably Overthinking It"},"image":{"@id":"https:\/\/www.allendowney.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/AllenDowney","https:\/\/www.linkedin.com\/in\/allendowney\/","https:\/\/bsky.app\/profile\/allendowney.bsky.social"]},{"@type":"Person","@id":"https:\/\/www.allendowney.com\/blog\/#\/schema\/person\/4e5bfb2e9af6c3446cb0031a7bf83207","name":"AllenDowney","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.allendowney.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/fb01b3a7f7190bea1bbf7f0852e686c2f8c03b099222df2ce4bc7926f15bcb43?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fb01b3a7f7190bea1bbf7f0852e686c2f8c03b099222df2ce4bc7926f15bcb43?s=96&d=mm&r=g","caption":"AllenDowney"},"url":"https:\/\/www.allendowney.com\/blog\/author\/allendowney_6dbrc4\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":902,"url":"https:\/\/www.allendowney.com\/blog\/2023\/04\/02\/llm-assisted-programming\/","url_meta":{"origin":689,"position":0},"title":"LLM-Assisted Programming","author":"AllenDowney","date":"April 2, 2023","format":false,"excerpt":"I've been experimenting with programming assisted by Large Language Models (LLMs) like ChatGPT. I am amazed at how good it is, and it seems clear to me that the great majority of programming work will be LLM-assisted, starting now. Here are some of the examples I've tried. Think Python For\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":308,"url":"https:\/\/www.allendowney.com\/blog\/2019\/09\/19\/what-should-i-do\/","url_meta":{"origin":689,"position":1},"title":"What should I do?","author":"AllenDowney","date":"September 19, 2019","format":false,"excerpt":"I am planning to be on sabbatical from June 2020 to August 2021, so I am thinking about how to spend it. Let me tell you what I can do, and you can tell me what I should do. Data Science I consider myself a data scientist, but that means\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1334,"url":"https:\/\/www.allendowney.com\/blog\/2024\/07\/17\/elements-of-data-science\/","url_meta":{"origin":689,"position":2},"title":"Elements of Data Science","author":"AllenDowney","date":"July 17, 2024","format":false,"excerpt":"I'm excited to announce the launch of my newest book, Elements of Data Science. As the subtitle suggests, it is about \"Getting started with Data Science and Python\". Order now from Lulu.com and get 20% off! I am publishing this book myself, which has one big advantage: I can print\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.allendowney.com\/blog\/wp-content\/uploads\/2024\/07\/image.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.allendowney.com\/blog\/wp-content\/uploads\/2024\/07\/image.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.allendowney.com\/blog\/wp-content\/uploads\/2024\/07\/image.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":140,"url":"https:\/\/www.allendowney.com\/blog\/2019\/01\/18\/the-library-of-data-visualization\/","url_meta":{"origin":689,"position":3},"title":"The library of data visualization","author":"AllenDowney","date":"January 18, 2019","format":false,"excerpt":"Getting ready for my Data Science class (starting next week!) I am updating my data visualization library, looking for resources to help students learn about visualization. Last week I asked Twitter to help me find resources, especially new ones.\u00a0 Here's the thread.\u00a0\u00a0Thank you to everyone who responded! I'll try to\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.allendowney.com\/blog\/wp-content\/uploads\/2019\/01\/Screenshot-at-2019-01-18-09-56-35-300x3.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1397,"url":"https:\/\/www.allendowney.com\/blog\/2024\/10\/22\/think-stats-3rd-edition\/","url_meta":{"origin":689,"position":4},"title":"Think Stats 3rd Edition","author":"AllenDowney","date":"October 22, 2024","format":false,"excerpt":"I am excited to announce that I have started work on a third edition of Think Stats, to be published by O'Reilly Media in 2025. At this point the content is mostly settled, and I am revising chapters to get them ready for technical review. If you want to start\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.allendowney.com\/blog\/wp-content\/uploads\/2024\/10\/image-8.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":201,"url":"https:\/\/www.allendowney.com\/blog\/2019\/04\/01\/local-regression-in-python\/","url_meta":{"origin":689,"position":5},"title":"Local regression in Python","author":"AllenDowney","date":"April 1, 2019","format":false,"excerpt":"I love data visualization make-overs (like this one I wrote a few months ago), but sometimes the tone can be too negative (like this one I wrote a few months ago). Sarah Leo, a data journalist at The Economist, has found the perfect solution: re-making your own visualizations. Here's her\u2026","rel":"","context":"In \"local regression\"","block_context":{"text":"local regression","link":"https:\/\/www.allendowney.com\/blog\/tag\/local-regression\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.allendowney.com\/blog\/wp-content\/uploads\/2019\/04\/image.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/posts\/689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/comments?post=689"}],"version-history":[{"count":1,"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/posts\/689\/revisions"}],"predecessor-version":[{"id":690,"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/posts\/689\/revisions\/690"}],"wp:attachment":[{"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/media?parent=689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/categories?post=689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.allendowney.com\/blog\/wp-json\/wp\/v2\/tags?post=689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}