Итерация по zip () - PullRequest
       7

Итерация по zip ()

0 голосов
/ 08 января 2019

У меня есть 2 списка одинакового размера, один - список векторов, а второй - их соответствующие теги:

l = [v1, v2,...]
tags = [True,False,...]

Я хочу сделать 2 списка, все (vi, тег), для которых их тег верен, и это комплимент. Я пытаюсь использовать функцию zip для этого так:

true_grp = [x for x in zip(l,tags) if x[1] is True]
false_grp = [x for x in zip(l,tags) if x[1] is False]

Оба списка оказываются пустыми. Я не вижу здесь проблемы, «х» должен представлять кортеж (vi, тег)

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Ваше решение должно работать нормально, но для ясности вы можете распаковать элементы в пределах списка. Обратите внимание, что следует проверить на логическое значение x через if x:

true_grp = [(value, flag) for value, flag in zip(l, tags) if flag]
false_grp = [(vale, flag) for value, flag in zip(l, tags) if not flag]

Поскольку эти списки связаны, гораздо лучше использовать словарь для хранения значений «Истина» и «Ложь». A collections.defaultdict удобно:

from collections import defaultdict

grp = defaultdict(list)
for value, flag in zip(l, tags):
    grp[flag].append(value)

Затем используйте grp[0] или grp[False] вместо false_grp; аналогично grp[1] или grp[True] вместо true_grp.

Одноходовое решение на основе словаря также имеет преимущество работы с произвольными итерациями l и tags. Если любой из них является итератором, решение для понимания списка не будет работать для false_grp, поскольку итерируемое может быть пройдено только один раз.

0 голосов
/ 08 января 2019

Не нужно использовать - это , вы можете напрямую проверять логические значения. Оператор is предназначен для проверки идентичности объекта и цитирования связанной документации:

Операторы проверяют подлинность объекта, а не проверяют: тогда и только тогда, когда x и y - один и тот же объект. Идентичность объекта определяется с помощью функции id (). х не у дает обратный значение истинности

код

l = list(range(5))
tags = [True, False, True, False, False]

true_grp = [x for x in zip(l,tags) if x[1]]
false_grp = [x for x in zip(l,tags) if not x[1]]

print(true_grp)
print(false_grp)

выход

[(0, True), (2, True)]
[(1, False), (3, False), (4, False)]
...