如何删除使用列表理解列表重复的项目? 我有下面的代码:
a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
b = []
b = [item for item in a if item not in b]
但它不工作,只是产生相同的名单。 为什么它的产生相同的名单?
如何删除使用列表理解列表重复的项目? 我有下面的代码:
a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
b = []
b = [item for item in a if item not in b]
但它不工作,只是产生相同的名单。 为什么它的产生相同的名单?
因为它是生产相同的列表b
包含在运行时没有任何元素。 你想要什么就这一点:
>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> b = []
>>> [b.append(item) for item in a if item not in b]
[None, None, None, None, None, None, None, None]
>>> b
[1, 2, 3, 5, 9, 6, 8, 7]
如果你不介意使用比列表中理解不同的技术,你可以使用一组:
>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> b = list(set(a))
>>> print b
[1, 2, 3, 5, 6, 7, 8, 9]
使用keys
在dict
与价值观构建a
作为其键。
b = dict([(i, 1) for i in a]).keys()
或者使用一组:
b = [i for i in set(a)]
究其原因,该清单是不变的是, b
开始是空的。 这意味着, if item not in b
总是True
。 已经生成列表之后才分配给变量这一新的非空列表b
。
使用GROUPBY :
>>> from itertools import groupby
>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> [k for k, _ in groupby(sorted(a, key=lambda x: a.index(x)))]
[1, 2, 3, 5, 9, 6, 8, 7]
离开了关键的参数,如果你不关心什么顺序值首次出现在最初的名单,如
>>> [k for k, _ in groupby(sorted(a))]
[1, 2, 3, 5, 6, 7, 8, 9]
你可以做一些很酷的事情groupby
。 要确定出现多次的项目:
>>> [k for k, v in groupby(sorted(a)) if len(list(v)) > 1]
[2, 3, 5, 8]
或者建立一个频率词典:
>>> {k: len(list(v)) for k, v in groupby(sorted(a))}
{1: 1, 2: 3, 3: 4, 5: 4, 6: 1, 7: 1, 8: 2, 9: 1}
有一些非常有用的功能在itertools模块: chain
, tee
和product
仅举几例!
>>> a = [10,20,30,20,10,50,60,40,80,50,40,0,100,30,60]
>>> [a.pop(a.index(i, a.index(i)+1)) for i in a if a.count(i) > 1]
>>> print(a)