[英]Itertools.chain.from_iterable
誰能向我解釋一下,這段代碼片段到底在做什么?
chained_country_list = set(itertools.chain.from_iterable(country_and_countrycodes)) & set(all_countries)
我知道它運行兩個相互對立的列表,最終得到一組唯一值,它存在於它比較的兩個列表中。
但它是如何做到的,以及幕后發生了什么,讓我感到困惑。
如果有人可以就這個問題分享一些看法,那將是一個巨大的幫助。
讓我們分解代碼的每個重要元素:
itertools.chain.from_iterable:
基本上,這用於展平嵌套列表,如下所示:
l = [[0], [1, 2], [2], [3, 6], [4], [5, 10]]
list(itertools.chain.from_iterable(l))
輸出:
[0, 1, 2, 2, 3, 6, 4, 5, 10]
&
兩個集合之間的運算符:
考慮以下集合 a 和 b 的示例。
a = {1, 2, 3}
b = {2, 3, 4}
a & b
輸出:
{2, 3}
所以基本上它獲取兩個集合之間的公共元素。 這里是 2 和 3。
代碼整體:
讓我們說:
country_and_countrycodes = [('United States', 'US'), ('China', 'CH')]
all_countries = ['United States', 'Mongolia', 'Togo']
現在,第一部分是:
set(itertools.chain.from_iterable(country_and_countrycodes))
這給了我們:
{'CH', 'China', 'US', 'United States'}
所以,它只是讓我們從元組中得到一個平面集。
然后,第二部分是:
set(itertools.chain.from_iterable(country_and_countrycodes)) & set(all_countries)
這給了我們:
{'United States'}
基本上,我們所做的是:
{'CH', 'China', 'US', 'United States'} & {'United States', 'Mongolia', 'Togo'}
由於這里唯一的公共元素是'United States'
,這就是我們得到的輸出。
如果不知道傳遞給函數的對象的類型和值,就很難判斷您的代碼做了什么。 然而,函數chain.from_iterable
試圖從country_and_countrycodes
創建一個扁平的可迭代對象,它大概應該是一個嵌套的可迭代對象,如嵌套列表。 在下一步, set
函數從展平的結果創建一個集合,以便與set(all_countries)
。
現在作為以下部分的更 Pythonic 替代品:
set(itertools.chain.from_iterable(country_and_countrycodes))
您可以將可迭代對象傳遞給set().union()
函數,以便一次創建唯一項的聯合集。
例子:
In [2]: set().union(*[[1, 3], [5, 6], [3, 5]])
Out[2]: {1, 3, 5, 6}
因此,您可以將該代碼更改為以下內容:
set().union(*country_and_countrycodes) & set(all_countries)
# Or
# set().union(*country_and_countrycodes).intersection(all_countries)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.