如何让我的代码成为一组?

时间:2012-10-14 20:57:22

标签: python

我有一个代码列表的小代码,只输出列表中唯一的项目。

这是我的代码

def only_once(a):
    return [x for x in a if a.count(x) is 1]

我的老师要求我们为这个功能使用套装。 有人能告诉我我能做什么吗?

我的代码必须输入a = [1,4,6,7,3,2,4,5,7,5,6],输出[1,3,2]。必须保留它的顺序。

3 个答案:

答案 0 :(得分:3)

为了澄清,你想要的是一组只出现一次的项目。

这里最好的选择是使用collections.Counter(),因为这意味着您只计算一次项目,而不是每项计算一次,大大提高了性能:

>>> import collections
>>> {key for key, count in collections.Counter(a).items() if count == 1}
{1, 2, 3}

我们只需用花括号替换方括号,以表示对列表理解的集合理解,以获得一组结果。

答案 1 :(得分:3)

如果您需要多次删除列表中的任何项目,而不是仅在第一次出现后删除,您可以使用:

# without using generators / comprehensions
def only_once(iterable):
    seen = set()
    duplicates = set()
    for item in iterable:
        if item in seen:
            duplicates.add(item)
        seen.add(item)
    result = []
    for item in iterable:
        if item not in duplicates:
            result.append(item)
    return result

对于一般订单保留重复消除,请参阅itertools recipes中的unique_everseen

def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in ifilterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element

答案 2 :(得分:3)

[我假设您也是用户1744238和用户1744316 - 请选择一个用户名并坚持使用,这样就可以更轻松地查看您问过的问题的哪些变体以及您已经问过什么试过。]

一种基于集合的方法是使用两组作为计数器。你只关心你曾经看过一次或多次。例如,这是一个易于解释的方法:

  1. oncemore设置一个空集。
  2. 遍历列表中的每个元素,并且:
    1. 如果您之前没有看过,请将其添加到once
    2. 如果您看过一次,请将其从once中删除,然后将其添加到more
  3. 现在你知道你在once集合中看到过一次的元素。
  4. 遍历列表的元素,如果您已经看过一次,请将其添加到输出列表中,然后将其从once集中删除,这样就不会输出相同的元素两次。 / LI>

    这给了我:

    In [49]: f([1,4,6,7,3,2,4,5,7,5,6])
    Out[49]: [1, 3, 2]