Pythoni c путь приводит к - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь добавить ключи и значения в один набор, но мне интересно, почему это:

corpus = {"1.html": {"2.html", "3.html"}, "2.html":
 {"3.html"}, "3.html": {"2.html"}}

unique = set(val for each in corpus.values() for val in each)
for x in corpus.keys():
    unique.add(x)

приводит к этому: {'2.html', '1.html', '3.html'}

, но это:

corpus = {"1.html": {"2.html", "3.html"}, "2.html":
 {"3.html"}, "3.html": {"2.html"}}

unique = set(val for each in corpus.values() for val in each)
unique.add(x for x in corpus.keys())

Результаты к этому: {<generator object <genexpr> at 0x106915f90>, '3.html', '2.html'}

Ответы [ 2 ]

1 голос
/ 03 мая 2020

set.add ожидает один аргумент, поэтому при передаче выражения генератора он добавляет его в набор.

Чтобы распаковать выражение генератора, передайте его в набор . обновление , которое ожидает повторяемость.

>>> s = {x for x in 'abc'}
>>> s.update(x for x in 'def')
>>> s
{'e', 'a', 'd', 'c', 'f', 'b'}
1 голос
/ 03 мая 2020

x for x in corpus.keys() является выражением генератора и генерируется только по требованию.

set.add() добавит элемент в набор, и не имеет значения, какой это тип. Вы должны добавить каждый элемент отдельно, как в первом примере.

...