【问题标题】:Dict comprehension tip听写理解技巧
【发布时间】:2016-01-04 20:36:15
【问题描述】:

我开始使用列表推导,但我对语法有点迷失,如何将其翻译成字典推导:

dict_users = Counter()
largo = len(wut)
for user in wut:
    count = 0
    for line in lines:
        if user in line:
            count += 1
    dict_users[user] = count

我尝试了不同的变体,但总是出错。

dict_users ={user: count for user in wut count = 0 for line in lines if user in lines}

【问题讨论】:

  • 我不确定使用字典理解是否是最好的方法。
  • @Christian 我只是想改进代码,但如果你们说不值得,那么我会保持原样
  • 我说我不确定。不是听写理解方面的专家。而且我不知道你为什么投反对票。这似乎是解决这个问题的公平尝试。
  • 可能被否决了,因为您的代码和问题没有提供足够的信息来让其他人轻松调试。例如,您正在使用像 lines 和 wut 这样的变量,而没有任何关于如何分配/实例化这些变量的上下文。
  • @DavidZemens 公平地说Counter(来自collections 模块)是标准库的一部分。我同意,lines 和 wut(wut?!)的示例会很有用。

标签: python dictionary


【解决方案1】:

您不能在生成器表达式/列表或字典理解中分配(count = 0 或 count += 1),您需要使用 sum 来代替这种事情。我想你想要的是:

dict_users = {user: sum(user in line for line in lines) for user in wut }

请注意,这使用了 True ('f' in 'foo') 和 False ('f' in 'bar') 在求和时分别计算为 1 和 0 的事实,因为布尔值是整数子类。一个简单的例子:

>>> lines = ['foo', 'bar', 'baz']
>>> users = ['ba', 'f']
>>> {user: sum(user in line for line in lines) for user in users}
{'ba': 2, 'f': 1}

但这可以说比您现在拥有的嵌套 for 循环的可读性差。

【讨论】:

【解决方案2】:

Counter 已经为你清点物品;您只需要适当的行序列作为参数传递。

dictUsers = Counter(line for user in wut for line in lines if user in line)

生成器表达式中的for 子句与等效的嵌套for 循环的顺序相同。

【讨论】:

    【解决方案3】:

    实际上,我最近阅读了一篇博客文章,它很好地解释了嵌套推导式,尽管我不记得链接了。扩展 jonrsharpe 的答案:

    for x in list_of_tuples:
        for y in x:
            do(y)
    

    变成:

    [do(y) for x in list_of_tuples for y in x]
    

    所以本质上你是在按下退格键直到你的所有for's 都在一行上,删除冒号,然后只是将最终函数移到前面。

    请记住,您不能有任何任务,只能用于和最终操作。

    无法理解:

    for x in range(10):
        x = range(x)
        for y in x:
            do(y)
    

    可以理解:

    for x in range(10):
        for y in range(x):
            do(y)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2021-03-11
      相关资源
      最近更新 更多