पर्ल में कोई यह कर सकता है:

my %seen;

foreach my $dir ( split /:/, $input ) {
        $seen{$dir}++;
}

यह "देखा गया" का ट्रैक रखकर डुप्लिकेट को निकालने का एक तरीका है। पायथन में आप नहीं कर सकते:

seen = {}

for x in ['one', 'two', 'three', 'one']:
    seen[x] += 1

उपरोक्त अजगर का परिणाम KeyError: 'one' है।

'देखा' हैश बनाने का पायथन-वाई तरीका क्या है?

0
Red Cricket 3 अप्रैल 2018, 23:27

3 जवाब

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

यह व्यवहार प्राप्त करने के लिए defaultdict का उपयोग करें। पकड़ यह है कि आपको उन चाबियों के लिए भी काम करने के लिए डिफॉल्टडिक्ट के लिए डेटाटाइप निर्दिष्ट करने की आवश्यकता है जिनके पास कोई मूल्य नहीं है:

In [29]: from collections import defaultdict

In [30]: seen = defaultdict(int)

In [31]: for x in ['one', 'two', 'three', 'one']:
    ...:     seen[x] += 1

In [32]: seen
Out[32]: defaultdict(int, {'one': 2, 'three': 1, 'two': 1})

आप काउंटर का भी उपयोग कर सकते हैं:

>>> from collections import Counter
>>> seen = Counter()
>>> for x in ['one', 'two', 'three', 'one']: seen[x] += 1
... 
>>> seen
Counter({'one': 2, 'three': 1, 'two': 1})

यदि आपको केवल अद्वितीय चाहिए, तो बस एक सेट ऑपरेशन करें: set(['one', 'two', 'three', 'one'])

0
mu 無 3 अप्रैल 2018, 21:18

यदि आप seen[x] += 1 को seen[x] = seen[x] + 1 में अनियंत्रित करते हैं, तो आपके कोड के साथ समस्या स्पष्ट है: आप इसे असाइन करने से पहले seen[x] तक पहुंचने का प्रयास कर रहे हैं। इसके बजाय, आपको यह जांचना होगा कि कुंजी पहले मौजूद है या नहीं:

seen = {}

for x in ['one', 'two', 'three', 'one']:
    if x in seen:
        seen[x] += 1  # we've seen it before, so increment
    else:
        seen[x] = 1  # first time seeing x
0
a spaghetto 3 अप्रैल 2018, 20:35

आप एक set का उपयोग कर सकते हैं:

>>> seen=set(['one', 'two', 'three', 'one'])
>>> seen
{'one', 'two', 'three'}
0
Günther Jena 3 अप्रैल 2018, 20:31