Skip to content

Commit 9158602

Browse files
author
Jacobsen
committed
Fixes #392.
1 parent a11b84d commit 9158602

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

toolz/dicttoolz.py

+18
Original file line numberDiff line numberDiff line change
@@ -313,3 +313,21 @@ def get_in(keys, coll, default=None, no_default=False):
313313
if no_default:
314314
raise
315315
return default
316+
317+
318+
def select_keys(d, keys, factory=dict):
319+
""" Select only certain keys from a dictionary
320+
321+
If supplied keys are not found in the dictionary, returns an empty
322+
dictionary.
323+
324+
>>> d = {'a': 1, 'b': 2, 'c': 3}
325+
>>> select_keys(d, ['a', 'b', 'd'])
326+
{'a': 1, 'b': 2}
327+
>>> select_keys(d, ['c'])
328+
{}
329+
"""
330+
rv = factory()
331+
for k in set(keys).intersection(d.keys()):
332+
rv[k] = d[k]
333+
return rv

toolz/tests/test_dicttoolz.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from collections import defaultdict as _defaultdict
2-
from toolz.dicttoolz import (merge, merge_with, valmap, keymap, update_in,
3-
assoc, dissoc, keyfilter, valfilter, itemmap,
4-
itemfilter, assoc_in)
2+
from toolz.dicttoolz import (assoc, assoc_in, dissoc, itemfilter,
3+
itemmap, keyfilter, keymap, merge,
4+
merge_with, select_keys, update_in,
5+
valfilter, valmap)
56
from toolz.utils import raises
67
from toolz.compatibility import PY3
78

@@ -117,6 +118,14 @@ def test_assoc_in(self):
117118
assert d is oldd
118119
assert d2 is not oldd
119120

121+
def test_select_keys(self):
122+
D, kw = self.D, self.kw
123+
assert select_keys(D({}), [], **kw) == D({})
124+
assert select_keys(D({"a": 1}), ["a"], **kw) == D({"a": 1})
125+
assert select_keys(D({"a": 1}), [], **kw) == D({})
126+
assert select_keys(D({"a": 1}), ["b"], **kw) == D({})
127+
assert select_keys(D({"a": 1, "b": 2}), ["b"], **kw) == D({"b": 2})
128+
120129
def test_update_in(self):
121130
D, kw = self.D, self.kw
122131
assert update_in(D({"a": 0}), ["a"], inc, **kw) == D({"a": 1})

0 commit comments

Comments
 (0)