[英]How to remove duplicates from list in python
我这里有一个简单的代码:
a=[['bcn09','113','shift1'],['bcn09','113','shift1'],['bps01','132','shift2']]
b=[]
for i in range (len(a)):
if a[i] not in b:
b.append([a[i]])
print (b)
我得到的输出是
b=[['bcn09','113','shift1'],['bcn09','113','shift1'],['bps01','132','shift2']]
即与a相同我需要的输出是
b=[['bcn09','113','shift1'],['bps01','132','shift2']]
我究竟做错了什么?
提前致谢
很接近! 您可以尝试这种方法,希望它有意义:
a=[['bcn09','113','shift1'],['bcn09','113','shift1'],['bps01','132','shift2']]
noDups = []
for i in a:
if i not in noDups:
noDups.append(i)
print(noDups)
输出:
>>>[['bcn09', '113', 'shift1'], ['bps01', '132', 'shift2']]
附加到“b”时无需创建新列表。
修改以下行 -
b.append([a[i]])
到
b.append(a[i])
新的输出是(你想要的) -
[['bcn09', '113', 'shift1'], ['bps01', '132', 'shift2']]
这解释了有关“in”成员资格测试运算符的更多信息。
对于仅从迭代中获取唯一值的最完整答案, itertools
提供了一个配方(也可以在 PyPI 上的more-itertools
包中找到):
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 filterfalse(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
此实现经过测试、优化、维护顺序,是一个生成器,因此它可以在无限迭代或需要懒惰的情况下工作,并允许您使用关键功能。
>>> a=[['bcn09','113','shift1'],['bcn09','113','shift1'],['bps01','132','shift2']]
>>> list(unique_everseen(tuple(item) for item in a))
[('bcn09', '113', 'shift1'), ('bps01', '132', 'shift2')]
请注意元组的更改,因此元素是可散列的并且可以添加到集合中。 如果需要,您当然可以在最后反转这一点,尽管在大多数情况下,我可以想象元组可能会很好。 (同样,我正在从生成器创建一个列表来显示输出,但大多数时候您应该能够直接使用生成器)。
你可以通过使用itertools
来实现
import itertools
a = [['bcn09','113','shift1'],['bcn09','113','shift1'],['bps01','132','shift2']]
a.sort()
new_num = list(a for a,_ in itertools.groupby(a))
print("New List", new_num)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.