понимание списка Python без в - PullRequest
0 голосов
/ 02 октября 2018

если flattend - это просто список строк, например

['There','is','only','passion','and','piece','is','a','lie','lie','lie']

, то в следующих двух строках

c = Counter(flattened)
vocab = [x for x, count in c.items() if count>=2]

чточасть [x для x, ...] означает?Кроме того, не должен ли count быть кортежем типа, так как я полагаю, что это встречный предмет?как получается, что эта часть count>=2 работает?!

Примечание. Из отладки я понимаю, что первая строка преобразует список в счетчик, а вторая удаляет элементы, возникшие менее чем в два раза.но я не могу толковать синтаксис

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

Давайте разберем его на строки:

vocab = [           # line0
         x          # line1
         for        # line2
         x, count   # line3
         in
         c.items()
         if
         count>=2]  # line7

Каждый tuple из c.items() состоит из ключа x (подсчитанного) и count (количество раз, когда этот ключ был виден).

В каждом цикле можно представить, что следующий tuple извлекается, затем распаковывается, так что вместо необходимости использовать одно значение с индексами 0 и1, вы можете просто обратиться к ним по имени;anontuple[0] становится x, anontuple[1] становится count.

Строка count>=2 затем фильтрует результаты;если count меньше 2, мы прекращаем обрабатывать этот элемент и вытаскиваем следующий.

Элемент, который нужно произвести в дальнем левом углу x;когда проверка фильтрации пройдена, мы помещаем соответствующее x в результирующее list без изменений.

При преобразовании в обычный цикл это будет выглядеть так (строки соответствуют строкам listcomp):

vocab = []                  # line0
for x, count in c.items():  # lines 2-5
    if count >= 2:          # lines 6-7
        vocab.append(x)     # line1

Если распаковка вас смущает, вы можете вместо этого представить ее как:

vocab = []              # line0
for item in c.items():  # lines 2, 4 and 5
    x = item[0]         # line3
    count = item[1]     # line3
    if count >= 2:      # line 6-7
        vocab.append(x) # line1
0 голосов
/ 02 октября 2018

Счетчик вернет словарь, как структура.Поэтому вам нужно перебирать ключи и значения, ключ - это x, а значение - это количество.Если мы внимательно посмотрим на c.items()

c.items() #list of tuples with (key,value)

[('and', 1),
 ('a', 1),
 ('lie', 3),
 ('is', 2), # x->'is' ,count->2
 ('There', 1),
 ('only', 1),
 ('passion', 1),
 ('piece', 1)]

Итак, если вы повторяете этот список для одного кортежа, есть два компонента: слово и связанный счетчик.Для подсчета вы проверяете, если count>=2, если да, то возвращаете тот ключ, который в списке составлений равен x

0 голосов
/ 02 октября 2018

[x for x, ...] просто использует x в качестве переменной при итерации по некоторому массиву ...

x, count захватывает два элемента, которые служат в качестве повторяющихся значений из c.items().

Если бы вы печатали результаты: for _ in c.items(): print(_) Это вывело бы список кортежей типа (x, count).

[x for x, count in c.items() if count > 2] просто сохраняет x в массиве при использовании countитерируемый как фильтр.

0 голосов
/ 02 октября 2018

Так что синтаксис здесь немного сбивает с толку, но на самом деле происходит то, что каждый элемент в c.items() является кортежем, содержащим слово и его счет.

Более понятный способ написания этого будет:

vocab = [x for (x, count) in c.items() if x>=2]

, но это также можно сделать так:

vocab = [x[0] for x in c.items() if x[1]>=2]

, где x - это кортеж.

Также полезно посмотреть накак на самом деле выглядит cЕсли вы напечатаете c, вы увидите:

>>> print c
Counter({'lie': 3, 'is': 2, 'and': 1, 'a': 1, 'There': 1, 'only': 1, 'passion': 1, 'piece': 1})

и c.items()

>>> print c.items()
[('and', 1), ('a', 1), ('lie', 3), ('is', 2), ('There', 1), ('only', 1), ('passion', 1), ('piece', 1)]
...