是否有内置功能可以从Python中的列表中删除重复项,同时保留顺序?我知道我可以使用一个集来删除重复项,但这会破坏原始顺序.我也知道我可以像这样滚动自己:
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
Run Code Online (Sandbox Code Playgroud)
但是如果可能的话,我想利用内置或更多的Pythonic习语.
阅读如何super()工作,我遇到了关于如何创建有序计数器的这个方法:
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elements are first seen'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__,
OrderedDict(self))
def __reduce__(self):
return self.__class__, (OrderedDict(self),)
Run Code Online (Sandbox Code Playgroud)
例如:
oc = OrderedCounter('adddddbracadabra')
print(oc)
OrderedCounter(OrderedDict([('a', 5), ('d', 6), ('b', 2), ('r', 2), ('c', 1)]))
Run Code Online (Sandbox Code Playgroud)
有人能够解释这是如何神奇地起作用的吗?
这也出现在Python文档中.
给定:列表,例如l = [4,4,4,4,5,5,5,6,7,7,7] Todo:获取元素的计数并保持其出现顺序,例如:[( 4,4),(5,3),(6,1),(7,3)]
我可以这样做:
tmpL = [(i,l.count(i)) for i in l]
tmpS = set()
cntList = [x for x in tmpL if x not in tmpS and not tmpS.add(x)]
Run Code Online (Sandbox Code Playgroud)
但有更好的方法吗?我在这里看到了这个链接,但它对计数进行了排序,因此打破了顺序.
编辑:性能不是解决方案的问题,更可取的是内置的东西.
例如,我需要计算一个单词出现在列表中的次数,不按频率排序,而是按单词出现的顺序排序,即插入顺序.
from collections import Counter
words = ['oranges', 'apples', 'apples', 'bananas', 'kiwis', 'kiwis', 'apples']
c = Counter(words)
print(c)
Run Code Online (Sandbox Code Playgroud)
所以代替: {'apples': 3, 'kiwis': 2, 'bananas': 1, 'oranges': 1}
我宁愿得到: {'oranges': 1, 'apples': 3, 'bananas': 1, 'kiwis': 2}
我真的不需要这种Counter方法,任何可以产生正确结果的方法对我来说都是可以的.