簡體   English   中英

Itertools.chain.from_iterable

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM