Itertools.chain.from_iterable - PullRequest
0 голосов
/ 09 июня 2018

Может кто-нибудь объяснить мне, что именно делает этот фрагмент кода?

chained_country_list = set(itertools.chain.from_iterable(country_and_countrycodes)) & set(all_countries)

Я знаю, что он запускает два списка друг против друга, заканчивая набором уникальных значений, которые существуют в обоихсписки, которые он сравнивает.

Но то, как он это делает и что происходит под капотом, сбивает меня с толку.

Было бы огромной помощью, если бы кто-то мог немного осветить проблему.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Давайте разберем каждый значимый элемент кода:

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', вот чтомы получили в качестве выхода.

0 голосов
/ 09 июня 2018

Трудно сказать, что делает ваш код, не зная типа и значения объектов, передаваемых в функции.Однако функция chain.from_iterable пытается создать уплощенную итерируемую переменную из country_and_countrycodes, которая предположительно должна быть вложенной итерацией, такой как вложенный список.На следующем шаге функция set создает набор из сглаженного результата, чтобы иметь возможность и возможность использовать set(all_countries).

Теперь в качестве более Pytonic альтернативы следующей части:

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)
...