没有in的python列表理解

时间:2018-10-02 18:33:12

标签: python list list-comprehension

例如 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 :(得分: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, countc.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被拉出,然后解压缩,这样,您无需使用带有索引01的单个值,就可以用名字称呼他们; anontuple[0]变成xanontuple[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