替换为列表理解

时间:2017-06-08 12:54:33

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

在这个脚本中我使用了list comprehension和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)

1 个答案:

答案 0 :(得分:3)

你根本不应该使用列表理解,也不应该使用现在的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的浮点结果转换回整数。