【问题标题】:Replace for with list comprehension用列表理解替换 for
【发布时间】:2017-06-08 12:54:33
【问题描述】:

在这个脚本中,我同时使用了列表推导和 for。我需要用理解替换 for 循环并将这个解决方案添加到列表理解中。

怎么加

for i in k:
    count_list.append(l.count(i))

在这个块内

pairs = [int(pair/2) for pair in count_list if int(pair/2) != 0]

我的代码:

def sockMerchant(ar):
    l = ar
    k = set(l)
    count_list = []
    for i in k:
         count_list.append(l.count(i))
    pairs = [int(pair/2) for pair in count_list if int(pair/2) != 0]
    return sum(pairs)

n = int(input().strip())
ar = list(map(int, input().strip().split(' ')))
result = sockMerchant(ar)
print(result)

【问题讨论】:

  • 你能举个论证的例子吗?会让事情变得更容易
  • 你为什么想要一个列表理解?使用collections.Counter() 代替,在循环中使用list.count() 效率非常低。
  • 亲爱的 Matjin 我不知道这个模块可能是因为这个原因 :) 我有一些解决方案,但我需要解决这个问题只使用列表理解。
  • @BahruzAghalarov:这是一个非常人为的限制。如果这是要求你对计数代码使用列表理解的作业,那么我建议你重新阅读课堂笔记和课本,如果需要,请向你的导师寻求帮助。
  • @BahruzAghalarov:如果您足够聪明,可以尝试操纵人们回答您,我相信您也可以弄清楚列表理解。祝你好运!

标签: python python-3.x for-loop list-comprehension


【解决方案1】:

您根本不应该使用列表推导式,也不应该使用您现在拥有的 for 循环。循环效率低下;通过使用 list.count(),您将遍历整个列表 l 以获取每个唯一值,从而创建一个 O(N^2) 循环。

改用collections.Counter() object 并计算 O(N) 时间:

from collections import Counter

def sockMerchant(ar):
    counts = Counter(ar)
    return sum(count//2 for count in counts.values())

甚至

def sockMerchant(ar):
    return sum(count//2 for count in Counter(ar).values())

如果你坚持单行。

请注意,sum() 不介意这里和那里的几个 0 值,所以我删除了单个“袜子”的 if 测试。另外,我使用了// floor division operator,而不是将除以2的浮点结果转换回整数。

【讨论】:

  • 这是理想的解决方案。谢谢您,我会记住这个方法 :) 但我的问题仍未得到解答 :( 如何将此块用作列表理解?我没有看到任何解决方案。跨度>
  • 对不起,我不会为了敲你的脚而给你一把锤子。列表推导式是构建列表的简单工具,任何for ...: list.append(...) 循环都可以轻松转换。
  • 我必须在另一个方法中使用这个方法是可以的。但我的问题是开放的。使用列表理解也不是问题,但我只需要使用一个列表理解而不是添加循环。如果可能的话,请写下 :)
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2021-11-20
  • 2017-07-29
  • 2023-03-29
相关资源
最近更新 更多