Skip to content

Instantly share code, notes, and snippets.

@kwatch
Created August 14, 2014 08:24
Show Gist options
  • Save kwatch/4f6a042ef8df98c7c35e to your computer and use it in GitHub Desktop.
Save kwatch/4f6a042ef8df98c7c35e to your computer and use it in GitHub Desktop.
問題3: シーケンスseqと関数keyを受け取り、要素のリストを値とするような辞書を返すような関数 group_by(seq, key) を定義してください。
# -*- coding: utf-8 -*-
##
## 問題3: シーケンスseqと関数keyを受け取り、要素のリストを値とするような辞書を返すような関数 group_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 = group_by(seq, key=lambda x: x['gender'])
## print(d)
## ## 結果
## { 'F': [
## {'id': 1, 'name': "Haruhi", 'gender': "F"},
## {'id': 2, 'name': "Mikuru", 'gender': "F"},
## {'id': 3, 'name': "Yuki", 'gender': "F"},
## ],
## 'M': [
## {'id': 4, 'name': "Ituki", 'gender': "M"},
## {'id': 5, 'name': "Kyon", 'gender': "M"},
## ],
## }
##
def group_by(seq, key):
d = {}
for x in seq:
k = key(x)
if k in d:
d[k].append(x)
else:
d[k] = [x]
## or
#d.setdefault(key(x), []).append(x) # shorter, but a litte slower
return d
## 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 = {
'F': [
{'id': 1, 'name': "Haruhi", 'gender': "F"},
{'id': 2, 'name': "Mikuru", 'gender': "F"},
{'id': 3, 'name': "Yuki", 'gender': "F"},
],
'M': [
{'id': 4, 'name': "Ituki", 'gender': "M"},
{'id': 5, 'name': "Kyon", 'gender': "M"},
],
}
assert group_by(seq, key=lambda x: x['gender']) == expected
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment