2014-12-03 3 views
1

У меня есть список номеров, как это:Как перенумеровать отсортированный по списку список целых чисел?

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

Он сортируется в порядке убывания и имеет много номеров.

Я хочу представить его как, тем больше число в списке, я хочу дать ему наименьшее значение и так далее. Подобно 687, становится 0, тогда 683 становится равным 1, тогда 677 становится равным 2 и так далее.

Есть ли способ сделать это?

EDIT:

На самом деле, я хочу, чтобы представить new_list в качестве [0,0,4,4,10,25..] таким образом, что самый высокий элемент получает 0, то следующий элемент представляет собой разность двух чисел в исходном списке + предыдущий номер в new_list, как мы получаем 4, делая (687-683) + 0 и так далее. Как это сделать?

+0

просто повторите этот список. –

ответ

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 

И мы получаем выход as:

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

@ LindaSu Я рад, что смог помочь. Если ответ был полезен, вы можете принять его или поднять. Благодарю. –

+0

@ LindaSu Спасибо Линда –

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 (п):

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 
+0

Отлично! Большое спасибо. –

+0

Один вопрос, можно ли добавить числа, начинающиеся с 0, а следующее число - разность двух чисел в исходном списке + предыдущий номер в new_list? Как и в примере, это будет: [0,0,4,4,10,25]? –

+0

@LindaSu: Конечно! См. Обновление. – Ryan

Смежные вопросы