如何重新编号反向排序的整数列表?

时间:2014-12-03 07:18:40

标签: python sorted reindex

我有一个这样的数字列表:

[687, 687, 683, 683, 677, 662....] 

它按降序排序,并且有很多数字。

我想表示它,列表中的数字越大,我想给它最小的值,依此类推。就像687变为0,然后683变为1,然后677变为2,依此类推。

有办法做到这一点吗?

编辑:

实际上,我想将new_list表示为[0,0,4,4,10,25..],使得最高元素为0,然后下一个元素是原始列表中两个数字的差异+ new_list中的前一个数字,就像我们得到的那样4做(687-683) + 0等等。怎么做?

2 个答案:

答案 0 :(得分:4)

从列表中创建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

答案 1 :(得分:1)

myList = [687, 687, 683, 683, 677, 662]
unique_sorted_list = sorted(list(set(myList)), reverse = True)
result = []
for i in range(len(unique_sorted_list)):
    if i == 0:
        result.append((unique_sorted_list[i], i))
    else:
        result.append((unique_sorted_list[i], unique_sorted_list[i-1] - unique_sorted_list[i] + result[i-1][1]))

result = [j[1] for i in myList for j in result if i==j[0]]  
print result

我们得到输出为:

[0, 0, 4, 4, 10, 25]