关于列表:忽略特定Python ListElements的优雅方式

Elegant Way of Ignoring Specific Python ListElements

本问题已经有最佳答案,请猛点这里访问。

我最近开始尝试学习Python,并尝试改进编写代码的方式,使之更"Python式"。因此,如果有人能向我解释一下以下内容是否可以更优雅地表达出来,那就太好了。希望这不是一个副本(我查过,但你永远不知道)

我有一个5个元素的列表,我想返回特定的元素。例如,我有[1,2,3,3,4]。我已经有了一个函数double(list),如果列表元素存在两次,它将返回该元素(在本例中是3)。

我想从这个列表中生成一个包含只存在一次的数字(1,2,4)的元组。

一种选择是:

  • 运行double(list)函数并获取double元素的值。
  • 创建空元组
  • 迭代列表项,如果值不等于double(list)函数返回的值,则将其添加到元组中。
  • 返回元组。
  • 我的问题是:有没有一种更优雅的/Python式的方法?(在一行中,使用可能更复杂的表达式?)

    提前谢谢


    实现这一点的一般方法是先对元素进行集合,然后对其进行计数,或者只使用collections.Counter,然后遍历列表,只包括适当的元素,方法是创建一个空列表,然后用传统循环添加到其中,或者使用带过滤器的理解。

    1
    2
    3
    4
    5
    6
    >>> import collections
    >>> l = [1, 2, 3, 3, 4]
    >>> c = collections.Counter(l)
    >>> new_list = [item for item in l if c[item] < 2]
    >>> new_list
    [1, 2, 4]


    因为您需要单行解决方案(当然,除了实际的列表声明:):

    1
    2
    3
    your_list = [1, 2, 3, 3, 4]

    uniques = [item for item in your_list if your_list.count(item) == 1]


    我会用collections.Counter来表示:

    1
    2
    3
    4
    5
    >>> import collections
    >>> l = [1, 2, 3, 3, 4]
    >>> c = collections.Counter(l)
    >>> [el for el in l if c[el] == 1]
    [1, 2, 4]