使用for循环检查列表时如何附加到新列表项?

时间:2017-11-26 18:25:57

标签: python

我遇到了这方面的问题,无法弄清楚为什么我的代码无效。有人可以帮我解决这个问题吗?我做了这个:

def f8(a_list, n):
    """
    The parameter a_list is a list of int's. The parameter n is an int.
    The function f8() should return a list that contains exactly one
    of each number in a_list that occurs less than n times in a_list.

    Example:
        f8([1, 1, 7, 7, 7, 3, 3, 3, 4, 4, 4, 5, 5], 3) should return
        [1, 5] (as 1 and 5 are the only numbers that occur less than 3
        times in a_list)
    """

    k = []
    for i in a_list:
        if i < a_list.count(n):
            k.append(i)
            return k


print f8([1, 7, 7, 3, 3, 3, 4, 4, 5], 2)

我希望它应该打印[1,5],但它只给我一个无。这是为什么?有人可以帮帮我吗?我被困在这里。

3 个答案:

答案 0 :(得分:3)

你有counting错误的方法!您需要计算i的出现次数,并将其与n进行比较。此外,您需要将return移到for-loop之外。最后,要删除最终list中的重复项,我们应该遍历set(a_list),以便我们只遍历unique elements。关于这一点的巧妙之处在于,由于我们正在计算原始a_list中的出现次数,因此我们不需要创建任何副本或任何繁琐的内容来处理此问题。

这会使您的function

def f8(a_list, n):
    k = []
    for i in set(a_list):
        if a_list.count(i) < n:
            k.append(i)
    return k

如果我们给它一个测试,它会起作用:

>>> f8([1, 1, 7, 7, 7, 3, 3, 3, 4, 4, 4, 5, 5], 3)
[1, 5]
>>> f8([1, 1, 2, 2, 2, 2, 4, 5, 6, 7, 7, 7, 7], 3)
[1, 4, 5, 6]

注意,如果您想缩短function,可以在one line list-comprehension中获得相同的结果:

def f8(a_list, n):
    return [i for i in set(a_list) if a_list.count(i) < n]

给出与上述测试相同的输出。

答案 1 :(得分:1)

首先,您不应该反复拨打count。每次调用都会迭代整个列表。您可以使用collections.Counter一次性获取所有计数。其次,您需要检查之前是否添加了任何元素以避免重复,只需调用set一个a_list将无法保证外观顺序:

from collections import Counter

def f8(a_list, n):
    c = Counter(a_list)
    k, seen = [], set()
    for x in a_list:
        if c[x] < n and x not in seen:
            seen.add(x)
            k.append(x)
    return k

答案 2 :(得分:0)

永远不会满足代码中append的条件,因此,不会返回任何值。相反,在循环结束后返回。此外,您的计算条件相反,因为您应该在列表中找到i的计数,而不是n

k = []
for i in a_list:
    if a_list.count(i) < n and i not in k:
        k.append(i)

return k

您收到None的原因是return语句没有通过,所以为了在函数调用期间满足变量存储,返回None