Python:从列表中删除特定项目的重复项

Cry*_*ryn 7 python list python-3.x

我有一个项目列表,我想删除一个项目的任何重复项的出现,但保留其余的重复项.即我从以下列表开始

mylist = [4, 1, 2, 6, 1, 0, 9, 8, 0, 9]
Run Code Online (Sandbox Code Playgroud)

我想删除任何重复0但保留重复的19.我目前的解决方案如下:

mylist = [i for i in mylist if i != 0]
mylist.add(0)
Run Code Online (Sandbox Code Playgroud)

0除了以下之外,还有一种很好的方法可以保持一次出现吗?

for i in mylist:
    if mylist.count(0) > 1:
        mylist.remove(0)
Run Code Online (Sandbox Code Playgroud)

第二种方法需要的时间是这个例子的两倍多.

澄清:

  • 目前,我不关心列表中项目的顺序,因为我目前在创建和清理它之后对其进行排序,但这可能会在以后更改.

  • 目前,我只需删除一个特定项目的重复项(0在我的示例中)

jpp*_*jpp 1

如果性能是一个问题并且您很乐意使用第 3 方库,请使用numpy.

\n\n

Python 标准库在很多方面都非常有用。数值数组的计算不是其中之一。

\n\n
import numpy as np\n\nmylist = np.array([4, 1, 2, 6, 1, 0, 9, 8, 0, 9])\n\nmylist = np.delete(mylist, np.where(mylist == 0)[0][1:])\n\n# array([4, 1, 2, 6, 1, 0, 9, 8, 9])\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里的第一个参数np.delete是输入数组。第二个参数提取所有出现 0 的索引,然后提取第二个实例。

\n\n

性能基准测试

\n\n

在 Python 3.6.2 / Numpy 1.13.1 上测试。性能将取决于系统和阵列。

\n\n
%timeit jp(myarr.copy())         # 183 \xc2\xb5s\n%timeit vui(mylist.copy())       # 393 \xc2\xb5s\n%timeit original(mylist.copy())  # 1.85 s\n\nimport numpy as np\nfrom collections import Counter\n\nmyarr = np.array([4, 1, 2, 6, 1, 0, 9, 8, 0, 9] * 1000)\nmylist = [4, 1, 2, 6, 1, 0, 9, 8, 0, 9] * 1000\n\ndef jp(myarr):\n    return np.delete(myarr, np.where(myarr == 0)[0][1:])\n\ndef vui(mylist):\n    return [0] + list(filter(None, mylist))\n\ndef original(mylist):\n    for i in mylist:\n        if mylist.count(0) > 1:\n            mylist.remove(0)\n\n    return mylist\n
Run Code Online (Sandbox Code Playgroud)\n