2013年4月9日火曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の9章(集合と辞書)の9.5(練習問題)を解いてみる。

1.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def find_dups(l):
    s = set()
    for x in l:
        if l.count(x) >= 2:
            s.add(x)
    return s

for x in [[],[1,2,3,4,5], [1,2,3,4,5,1,2],[1,2,3,4,5,1,2,1]]:
    print(x, find_dups(x))

入出力結果(Terminal)

$ ./sample.py
[] set()
[1, 2, 3, 4, 5] set()
[1, 2, 3, 4, 5, 1, 2] {1, 2}
[1, 2, 3, 4, 5, 1, 2, 1] {1, 2}
$

2.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def mating_pairs(males, females):
    pairs = set()
    while males:
        pairs.add((males.pop(), females.pop()))
    return pairs

print(mating_pairs({'a','b',1,2}, {'c',3,'d',4}))

入出力結果(Terminal)

$ ./sample.py
{(1, 'd'), ('b', 4), (2, 3), ('a', 'c')}
$

3.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def getAuthors(filename):
    authors = set()
    with open(filename) as f:
        for line in f:
            if line[0:6] == "AUTHOR":
                line = line[6:].strip()
                if line != "":
                    authors.add(line)
    return authors

import sys
for filename in sys.argv[1:]:
    print(getAuthors(filename))

入出力結果(Terminal)

$ ./sample.py tmp1.txt tmp2.txt
set()
{'kamimura', '長尾高弘'}
$

5.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def count_values(d):
    res = []
    for k, v in d.items():
        if not v in res:
            res.append(v)
    return len(res)

print(count_values({'赤':1,'緑':1,'青':2}))

入出力結果(Terminal)

$ ./sample.py
2
$

6.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def find_least(d):
    m = 1
    for k, v in d.items():
        if v < m:
            res = k
    return res

if __name__ == '__main__':
    d = {'ニュートロン':0.55, '陽子':0.21,
         '中間子':0.03, 'ミューオン':0.07,
         'ニュートリノ':0.14}
    print(find_least(d))

入出力結果(Terminal)

$ ./sample.py
中間子
$

7.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def count_duplicates(d):
    duplicates = []
    res = 0
    for v in d.values():
        if v in duplicates:
            res += 1
        else:
            duplicates.append(v)
    return res

if __name__ == '__main__':
    d1 = {'a':1,'b':1,'c':2,'d':3,'e':2}
    d2 = {'a':1,'b':2,'c':3,'d':4,'e':5}
    for d in [d1, d2]:
        print(d, count_duplicates(d))

入出力結果(Terminal)

$ ./sample.py
{'e': 2, 'd': 3, 'a': 1, 'c': 2, 'b': 1} 2
{'e': 2, 'd': 3, 'a': 1, 'c': 2, 'b': 1} 0
$

8.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def fetch_and_set(d, key, new_value):
    if key in d:
        res = d[key]
        d[key] = new_value
        return res
    raise KeyError("Unable to replace value for nonexistent key")

if __name__ == '__main__':
    d1 = {'a':1,'b':2,'c':3,'d':4,'e':5}
    d2 = {'a':1,'b':2}
    for d in [d1, d2]:
        try:
            res = fetch_and_set(d, 'd', "new value")
            print("元の値: {0} 新たな辞書: {1}".format(res, d))
        except Exception as err:
            print(type(err), err, err.args)

入出力結果(Terminal)

$ ./sample.py
元の値: 4 新たな辞書: {'e': 5, 'd': 'new value', 'c': 3, 'b': 2, 'a': 1}
<class 'KeyError'> 'Unable to replace value for nonexistent key' ('Unable to replace value for nonexistent key',)
$

9.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def is_balanced(rgb):
    return rgb['R'] + rgb['G'] + rgb['B'] == 1

if __name__ == '__main__':
    for d in [{'R':0.2, 'G':0.3,'B':0.5}, {'R':0.2, 'G':0.3,'B':0.4}]:
        print(d, is_balanced(d))

入出力結果(Terminal)

$ ./sample.py
{'R': 0.2, 'B': 0.5, 'G': 0.3} True
{'R': 0.2, 'B': 0.4, 'G': 0.3} False
$

10.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def dict_itersect(x, y):
    res = {}
    for k in x.keys():
        if (k in y) and x[k] == y[k]:
            res[k] = x[k]
    return res

if __name__ == '__main__':
    d1 = {'a':1,'b':2,'c':3,'d':4,'e':5}
    d2 = {'f':6,'g':7,'a':1,'h':8,'b':2}
    print(d1, d2, dict_itersect(d1, d2), sep="\n")

入出力結果(Terminal)

$ ./sample.py
{'e': 5, 'd': 4, 'a': 1, 'c': 3, 'b': 2}
{'g': 7, 'f': 6, 'a': 1, 'h': 8, 'b': 2}
{'a': 1, 'b': 2}
$

11.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def db_headings(d):
    res = set()
    for v in d.values():
        res = res.union(set(v.keys()))
    return res

if __name__ == '__main__':
    d = {
        'Jグードル': {
            '姓':'グドール',
            '名':'ジェーン',
            '生年':1934,
            '没年':None,
            '注目':'霊長類研究者',
            '著作':['In the Shadow of Man', 'The Chimpanzees of Gombe']
        },
        'Rフランクリン': {
            '姓':'フランクリン',
            '名':'ロザリンド',
            '生年':1920,
            '没年':1957,
            '注目':'DNAの発見に貢献'
        },
        'Rカーソン': {
            '姓':'カーソン',
            '名':'レイチェル',
            '生年':1907,
            '没年':1964,
            '注目':'DDTの害毒に注意を喚起',
            '著作':['沈黙の春']
        }
    }
print(db_headings(d))

入出力結果(Terminal)

$ ./sample.py
{'名', '著作', '注目', '姓', '生年', '没年'}
$

12.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def db_consistent(d):
    keys = set()
    for v in d.values():
        keys = set(v.keys())
        break
    for v in d.values():
        if keys != set(v.keys()):
            return False
    return True

if __name__ == '__main__':
    d1 = {
        'Jグードル': {
            '姓':'グドール',
            '名':'ジェーン',
            '生年':1934,
            '没年':None,
            '注目':'霊長類研究者',
            '著作':['In the Shadow of Man', 'The Chimpanzees of Gombe']
        },
        'Rフランクリン': {
            '姓':'フランクリン',
            '名':'ロザリンド',
            '生年':1920,
            '没年':1957,
            '注目':'DNAの発見に貢献'
        },
        'Rカーソン': {
            '姓':'カーソン',
            '名':'レイチェル',
            '生年':1907,
            '没年':1964,
            '注目':'DDTの害毒に注意を喚起',
            '著作':['沈黙の春']
        }
    }
    d2 = {
        'Jグードル': {
            '姓':'グドール',
            '名':'ジェーン',
            '生年':1934,
            '没年':None,
            '注目':'霊長類研究者',
            '著作':['In the Shadow of Man', 'The Chimpanzees of Gombe']
        },
        'Rフランクリン': {
            '姓':'フランクリン',
            '名':'ロザリンド',
            '生年':1920,
            '没年':1957,
            '注目':'DNAの発見に貢献',
            "著作": None
        },
        'Rカーソン': {
            '姓':'カーソン',
            '名':'レイチェル',
            '生年':1907,
            '没年':1964,
            '注目':'DDTの害毒に注意を喚起',
            '著作':['沈黙の春']
        }
    }
    for d in [d1, d2]:
        print(db_consistent(d))

入出力結果(Terminal)

$ ./sample.py
False
True
$

13.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def counter(filename):
    count = {}
    with open(filename) as f:
        for line in f:
            line = line.strip()
            if not line:
                continue
            count[line] = count.get(line, 0) + 1
    return count

def k_vTov_k(d):
    freq = {}
    for k, v in d.items():
        if v in freq:
            freq[v].append(k)
        else:
            freq[v] = [k]
    return freq

if __name__ == '__main__':
    import sys
    print(k_vTov_k(counter(sys.argv[1])))

入出力結果(Terminal)

$ cat tmp.txt

a
ab
abc
abcd
abcde

a
ab
abc
abcd

a
ab
abc

a
ab
a
a
$ ./sample.py tmp.txt
{1: ['abcde'], 2: ['abcd'], 3: ['abc'], 4: ['ab'], 6: ['a']}
$

14.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def sparse_add(x, y):
    res = x.copy()
    for k, v in y.items():
        if k in res:
            res[k] += v
        else:
            res[k] = v
    return res

def sparse_dot(x, y):
    res = 0
    for k in x:
        if k in y:
            res += x[k] * y[k]
    return res

if __name__ == '__main__':
    d1 = {0:1, 5:2, 6:3,10:4}
    d2 = {1:5, 20:6, 5:7, 6:8}
    print(d1, d2)
    for func in [sparse_add, sparse_dot]:
        print(func.__name__, func(d1, d2))

入出力結果(Terminal)

$ ./sample.py
{0: 1, 10: 4, 5: 2, 6: 3} {1: 5, 20: 6, 5: 7, 6: 8}
sparse_add {0: 1, 1: 5, 20: 6, 5: 9, 6: 11, 10: 4}
sparse_dot 38
$

0 コメント:

コメントを投稿