例如 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
这部分如何工作?!
注意: 从调试中我了解到,第一行将列表转换为计数器,第二行将发生次数少于两次的项目删除。但我无法真正解释语法
答案 0 :(得分:2)
所以这里的语法有点混乱,但是实际上发生的是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)]
答案 1 :(得分:2)
Counter将返回类似于结构的字典。因此,您需要遍历键和值,键是x,值是count。如果我们仔细观察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
答案 2 :(得分:0)
[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
可迭代作为过滤器。
答案 3 :(得分:0)
我们将其分为几行:
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