2011-07-01 6 views
5

मेरे पास संख्याओं की एक सूची होगी, प्रत्येक अपनी लाइन पर (0 -100 कहें)। मैं उन नंबरों को कैसे ढूंढूं जो सूचीबद्ध नहीं हैं या गायब हैं?मैं उन नंबरों को कैसे ढूंढूं जो सूचीबद्ध या अनुपलब्ध नहीं हैं?

+0

आपको बार-बार क्या है संख्या? क्या वे क्रमबद्ध हैं? क्या यह होमवर्क है? :-) – juanchopanza

+0

पायथन या बैश? – Chetan

उत्तर

12

उन्हें सभी को एक सेट में जोड़ें। फिर 1-100 से भरे सेट से घटाएं। यहाँ 0-9 के लिए एक उदाहरण है:

>>> set(range(10)) - set([1, 4, 5, 6, 8, 2]) 
set([0, 9, 3, 7]) 
>>> 

मैं [1, 4, 5, 6, 8, 2] सूचीबद्ध किया था। यह पता लगाने के लिए कि 0-9 रेंज में कौन सी संख्याएं गायब हैं, मैंने 0-9 के साथ एक सेट बनाया और फिर सेट को [1, 4, 5, 6, 8, 2] से घटा दिया। और पता चला कि [0, 9, 3, 7] गायब थे।

सेट इसके लिए काफी कुशल हैं। एक अतिरिक्त लाभ के रूप में, डुप्लीकेट को सुन्दर तरीके से संभाला जाएगा।

+1

यह वास्तव में एक सुंदर समाधान है। – Chetan

+0

कोई दोहराया संख्या नहीं और हाँ वे क्रमबद्ध किया जाएगा। नहीं, यह होमवर्क नहीं है :) – curious1

+0

यदि आपको सॉर्ट किए गए आउटपुट की आवश्यकता है तो सेट को एक क्रमबद्ध सूची –

1

तो एल नंबर की सूची,

set(L).difference(xrange(101)) 

है तो xrange

In [1]: L=[1, 4, 5, 6, 8, 2] 

In [2]: timeit set(range(101)) - set(L) 
10000 loops, best of 3: 21.7 µs per loop 

In [3]: timeit set(L).symmetric_difference(range(101)) 
100000 loops, best of 3: 14.2 µs per loop 

In [4]: timeit set(L).difference(range(101)) 
100000 loops, best of 3: 9.73 µs per loop 
+0

आप 'अंतर' का भी उपयोग कर सकते हैं, 'symmetric_difference' अनिवार्य रूप से एक एक्सओआर –

+0

@Eli, अच्छा बिंदु, अभी भी तेज है –

0

यहाँ एक साहचर्य का उपयोग कर एक awk समाधान है से एक सेट बनाने की बचत होती है (की-वैल्यू) सरणी:

printf '%s\n' 1 4 5 6 8 2 | 
awk -F " " -v first=0 -v last=9 ' 
BEGIN { 
    for(i=first; i<=last; i++) 
    array[i] = 0 
} 
{ 
    for(i=1;i<=NF;i++) 
    array[$i] += 1 
} 
END { 
    for (num in array) 
    if (array[num] == 0) print num 
} 
' 
  • सबसे पहले, हम cre किसी दी गई श्रेणी के सभी नंबरों को डिफ़ॉल्ट मान 0.
  • के साथ एकल कुंजी के रूप में उपयोग किया जाता है के साथ एक सरणी खाया हर इनपुट संख्या तो सरणी के लिए एक कुंजी के रूप awk द्वारा कार्रवाई की जाती है तो यह है कि मूल्य पर से 1.
  • वृद्धि हो जाता है अंत में, केवल उन चाबियों को मुद्रित किया जाता है जो वृद्धि नहीं हुई हैं, यानी उनके पास 0 का मान है (क्योंकि वे संख्याओं की इनपुट रेंज में अनुपलब्ध थे)।
0

बैश:

# first set up an array containing the whole range 
declare -a nums 
for i in {0..100}; do 
    nums[$i]=1 
done 

# then read the file and remove the numbers from it 
while read number; do 
    unset nums[$number] 
done < file.with.numbers 

# the remaining array keys are the numbers not found in the file 
for number in "${!nums[@]}"; do 
    echo $number 
done 
संबंधित मुद्दे

 संबंधित मुद्दे