2011-07-01 9 views

答えて

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

Lは、次いで、

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

あなたは 'difference'も使うことができます。' symmetric_difference'は本質的にXORです –

+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 
} 
' 
  • まず、we creデフォルト値0の単一のキーとして使用されている与えられた範囲のすべての数字を持つ配列を返しました。
  • すべての入力番号は、値が1だけ増えるようにawkによって配列のキーとして処理されます。
  • インクリメントされていない、つまり0の値を持つキーが印刷されます(数値の入力範囲に欠落しているため)。
0

のbash:あなたは数字を

# 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 
関連する問題