創建Counter
淘汰之列,取代了排序結果的鑰匙,並把那回列表:
from collections import Counter
from itertools import count
# Get counts of each element in the list
original_counter = Counter([687, 687, 683, 683, 677, 662])
# Get only the unique values, in descending order
values = (v for k, v in sorted(original_counter.items(), reverse=True))
# Create a new counter out of 0, 1, 2, … and the sorted, unique values
new_counter = Counter(dict(zip(count(), values)))
# Retrieve a sorted list from the new counter
new_list = sorted(new_counter.elements())
print(new_list) # [0, 0, 1, 1, 2, 3]
這並不需要進行排序原始列表,要麼。它使一個緊湊的功能:
from collections import Counter
from itertools import count
def enumerate_unique(iterable):
return sorted(Counter(dict(zip(count(),
(v for k, v in sorted(Counter(iterable).items(), reverse=True)))))
.elements())
關於第二個想法,雖然,直接的方式並不差。它也更高效一些。
def enumerate_unique(iterable):
seen = {}
counter = 0
for x in iterable:
i = seen.get(x)
if i is None:
seen[x] = counter
yield counter
counter += 1
else:
yield i
那個可以在任何列表上工作。既然你有一個排序的名單,不過,有一個非常漂亮的O(N):
def enumerate_unique(sorted_iterable):
last = None
counter = -1
for x in sorted_iterable:
if x != last:
counter += 1
yield counter
要跳過的數字所描述的,你可以這樣做:
def enumerate_unique(sorted_iterable):
last = None
last_index = -1
for i, x in enumerate(sorted_iterable):
if x != last:
last_index = i
yield last_index
只是迭代列表。 – 2014-12-03 07:27:23