मान लें कि मेरे पास हैशबल मान उत्पन्न करने वाला जनरेटर है (str/int आदि) क्या जेनरेटर को एक ही मान को दो बार उत्पन्न करने से रोकने का कोई तरीका है?

जाहिर है, मैं एक जनरेटर का उपयोग कर रहा हूं, इसलिए मुझे पहले सभी मूल्यों को अनपैक करने की आवश्यकता नहीं है, इसलिए yield from set(some_generator) जैसा कुछ विकल्प नहीं है, क्योंकि यह पूरे जनरेटर को अनपैक कर देगा।

उदाहरण:

# Current result
for x in my_generator():
    print(x)

>>> 1
>>> 17
>>> 15
>>> 1   # <-- This shouldn't be here
>>> 15  # <-- This neither!
>>> 3
>>> ...

# Wanted result
for x in my_no_duplicate_generator():
    print(x)

>>> 1
>>> 17
>>> 15
>>> 3
>>> ...

इसके लिए सबसे पाइथोनिक समाधान क्या है?

0
bluesummers 28 जुलाई 2019, 11:21

2 जवाब

सबसे बढ़िया उत्तर

एक unique_everseen है पायथन itertools मॉड्यूल व्यंजनों में जो लगभग @ NikosOikou के उत्तर के बराबर है।

इन समाधानों का मुख्य दोष यह है कि वे इस परिकल्पना पर भरोसा करते हैं कि चलने योग्य के तत्व धोने योग्य हैं:

>>> L = [[1], [2,3], [1]]
>>> seen = set()
>>> for e in L: seen.add(e)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

more-itertools मॉड्यूल अनहैशेबल तत्वों को स्वीकार करने के लिए कार्यान्वयन को परिष्कृत करता है और डॉक्टर एक टिप देता है कुछ मामलों में अच्छी गति कैसे रखें (अस्वीकरण: मैं टिप का "लेखक" हूं)।

आप स्रोत कोड देख सकते हैं।

2
jferard 28 जुलाई 2019, 12:50

आप इसे आजमा सकते हैं:

def my_no_duplicate_generator(iterable):
    seen = set()
    for x in iterable:
        if x not in seen:
            yield x
            seen.add(x)

आप अपने जनरेटर को तर्क के रूप में पास करके इसका उपयोग कर सकते हैं:

for x in my_no_duplicate_generator(my_generator()):
    print(x)
2
Nikos Oikou 29 जुलाई 2019, 00:42