संबंधित आईडी के साथ पहले से ही देखे गए तत्वों का मानचित्र रखें।
from itertools import count
from collections import defaultdict
mapping = defaultdict(count().__next__)
result = []
for element in my_list:
result.append(mapping[tuple(element)])
तुम भी एक सूची-समझ इस्तेमाल कर सकते हैं:
result = [mapping[tuple(element)] for element in my_list]
दुर्भाग्य list
रों ताकि आप जब उन्हें मैपिंग की कुंजी के रूप में संग्रहीत करने के लिए उन्हें एक tuple
में बदलने के लिए है hashable नहीं कर रहे हैं।
नोट defaultdict
का उपयोग करने का चाल, और count().__next__
अद्वितीय बढ़ती आईडी प्रदान करने के लिए। Python2 पर आपको को .next
के साथ प्रतिस्थापित करना होगा।
defaultdict
कोई कुंजी नहीं मिलने पर डिफ़ॉल्ट मान असाइन करेगा। डिफॉल्ट मान कन्स्ट्रक्टर में दिए गए फ़ंक्शन को कॉल करके प्राप्त किया जाता है। इस मामले में __next__
count()
जनरेटर की संख्या बढ़ती संख्या पैदा करती है।
एक अधिक पोर्टेबल विकल्प तुम कर सकते हो के रूप में:
result = [my_list.index(el) for el in my_list]
:
from functools import partial
mapping = defaultdict(partial(next, count()))
एक वैकल्पिक समाधान, के रूप में टिप्पणी में प्रस्तावित है, बस विशिष्ट आईडी के रूप में इंडेक्स का उपयोग करने के लिए है हालांकि यह लागू है:
- यह तों हे (एन^2) हे के बजाय समय (एन)
- आईडी, अद्वितीय हैं बढ़ रही है, लेकिन लगातार नहीं (जो या एक समस्या नहीं हो सकता)
दो समाधान की तुलना के लिए देखें:
In [1]: from itertools import count
...: from collections import defaultdict
In [2]: def hashing(seq):
...: mapping = defaultdict(count().__next__)
...: return [mapping[tuple(el)] for el in seq]
...:
In [3]: def indexing(seq):
...: return [seq.index(i) for i in seq]
...:
In [4]: from random import randint
In [5]: seq = [[randint(1, 20), randint(1, 20), randint(1, 20)] for _ in range(90000)]
In [6]: %timeit hashing(seq)
10 loops, best of 3: 37.7 ms per loop
In [7]: %timeit indexing(seq)
1 loop, best of 3: 26 s per loop
नोट कैसे एक 90k तत्व सूची के लिए मानचित्रण समाधान कम 40 मिलीसेकेंड लेता जबकि अनुक्रमण समाधान 26 सेकंड लेता है।
आईडी किया है अनुक्रमिक हो? यदि आप नहीं जानते हैं तो आप आसानी से सूचियों की 'इंडेक्स' विधि का दुरुपयोग कर सकते हैं: 'def get_ids (li): li में मेरे लिए li.index (i) लौटें];' जो '[0, 1, 0, 1, 4] देता है '[[1,2,3], [1,2,4], [1,2,3], [1,2,4], [1,2,5]]' – DeepSpace
@DeepSpace जो लेता है ओ (एन^2) समय। इसे सूची की एक क्रमबद्ध प्रतिलिपि की गणना करके सुधार किया जा सकता है और इसके साथ इंडेक्स को कुशलतापूर्वक संबद्ध करने के लिए 'bisect' का उपयोग करके, समय ओ (एन लॉग एन) बनाना जो तुलनात्मक रूप से इस समस्या को हल करने के लिए निचला स्तर है। – Bakuriu