1

次のような番号のリストがあります。

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

降順にソートされており、数字が多い。

リスト内の数値が大きいほど、最小値を指定したいなどのように表現したいと思います。687 が 0 になるように、次に 683 が 1 になり、次に 677 が 2 になります。

これを行う方法はありますか?

編集:

実際には、最上位の要素が 0 になるように new_list を表現したいのですが[0,0,4,4,10,25..]、次の要素は元のリストの 2 つの数値 + new_list の前の数値の差になり(687-683) + 0ます。どうやってするか?

4

2 に答える 2

4

リストからa を作成し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-03T07:29:20.697 に答える
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]
于 2014-12-03T07:33:11.957 に答える