Bạn có thể làm điều này trong O(N)
thời gian sử dụng một defaultdict
và một danh sách hiểu:
>>> from itertools import count
>>> from collections import defaultdict
>>> lst = [10, 10, 20, 15, 10, 20]
>>> d = defaultdict(count(1).next)
>>> [d[k] for k in lst]
[1, 1, 2, 3, 1, 2]
Trong Python 3 sử dụng __next__
thay vì next
.
Nếu bạn đang tự hỏi nó hoạt động như thế nào?
Các default_factory
(tức count(1).next
trong trường hợp này) truyền cho defaultdict
được gọi là chỉ khi Python gặp một chìa khóa bị mất, vì vậy trong 10 giá trị sẽ là 1, sau đó trong mười tiếp theo nó không phải là một chìa khóa bị mất nữa do đó tính toán 1 trước đây được sử dụng, bây giờ 20 lại là một khóa bị thiếu và Python sẽ gọi lại số default_factory
để nhận giá trị của nó và cứ thế.
d
ở cuối sẽ trông như thế này:
>>> d
defaultdict(<method-wrapper 'next' of itertools.count object at 0x1057c83b0>,
{10: 1, 20: 2, 15: 3})
Nguồn
2015-12-16 13:58:09
Bạn có quan tâm đến độ phức tạp của không gian hoặc độ phức tạp thời gian không? –
Bạn có thể sử dụng NumPy không? –