Skip to content

Instantly share code, notes, and snippets.

@kwatch
Created August 14, 2014 08:16
Show Gist options
  • Save kwatch/5b229d7b9e794597117e to your computer and use it in GitHub Desktop.
Save kwatch/5b229d7b9e794597117e to your computer and use it in GitHub Desktop.
問題2: シーケンスseqと関数keyを受け取り、要素を値とする辞書を返すような関数 index_by(seq, key) を定義してください。
# -*- coding: utf-8 -*-
##
## 問題2: シーケンスseqと関数keyを受け取り、要素を値とする辞書を返すような関数 index_by(seq, key) を定義してください。
## 例:
## seq = [ {'id': 1, 'name': "Haruhi", 'gender': "F"},
## {'id': 2, 'name': "Mikuru", 'gender': "F"},
## {'id': 3, 'name': "Yuki", 'gender': "F"},
## {'id': 4, 'name': "Ituki", 'gender': "M"},
## {'id': 5, 'name': "Kyon", 'gender': "M"},
## ]
## d = index_by(seq, key=lambda x: x['id'])
## print(d)
## ## 結果
## { 1: {'id': 1, 'name': "Haruhi", 'gender': "F"},
## 2: {'id': 2, 'name': "Mikuru", 'gender': "F"},
## 3: {'id': 3, 'name': "Yuki", 'gender': "F"},
## 4: {'id': 4, 'name': "Ituki", 'gender': "M"},
## 5: {'id': 5, 'name': "Kyon", 'gender': "M"} }
##
def index_by(seq, key):
d = {}
for x in seq:
k = key(x)
if k in d:
raise KeyError("%r: duplicated index" % (k,))
d[k] = x
return d
##
## 補足:
## キーが被ってないことがわかっているなら、この関数を使わなくても、
## d= { key(x): x for x in seq }
## でよい(だたし Python 2.7 以上)。
##
## test
if __name__ == '__main__':
seq = [
{'id': 1, 'name': "Haruhi", 'gender': "F"},
{'id': 2, 'name': "Mikuru", 'gender': "F"},
{'id': 3, 'name': "Yuki", 'gender': "F"},
{'id': 4, 'name': "Ituki", 'gender': "M"},
{'id': 5, 'name': "Kyon", 'gender': "M"},
]
expected = {
1: {'id': 1, 'name': "Haruhi", 'gender': "F"},
2: {'id': 2, 'name': "Mikuru", 'gender': "F"},
3: {'id': 3, 'name': "Yuki", 'gender': "F"},
4: {'id': 4, 'name': "Ituki", 'gender': "M"},
5: {'id': 5, 'name': "Kyon", 'gender': "M"},
}
assert index_by(seq, key=lambda x: x['id']) == expected
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment