Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions toolz/curried/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
assoc_in = toolz.curry(toolz.assoc_in)
cons = toolz.curry(toolz.cons)
countby = toolz.curry(toolz.countby)
dissoc = toolz.curry(toolz.dissoc)
do = toolz.curry(toolz.do)
drop = toolz.curry(toolz.drop)
excepts = toolz.curry(toolz.excepts)
Expand Down
20 changes: 14 additions & 6 deletions toolz/dicttoolz.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import copy
import operator
from toolz.compatibility import (map, zip, iteritems, iterkeys, itervalues,
reduce)
Expand Down Expand Up @@ -197,7 +196,7 @@ def assoc(d, key, value, factory=dict):
return d2


def dissoc(d, *keys):
def dissoc(d, *keys, **kwargs):
""" Return a new dict with the given key(s) removed.

New dict has d[key] deleted for each supplied key.
Expand All @@ -210,10 +209,19 @@ def dissoc(d, *keys):
>>> dissoc({'x': 1}, 'y') # Ignores missing keys
{'x': 1}
"""
d2 = copy.copy(d)
for key in keys:
if key in d2:
del d2[key]
factory = _get_factory(dissoc, kwargs)
d2 = factory()

if len(keys) < len(d) * .6:
d2.update(d)
for key in keys:
if key in d2:
del d2[key]
else:
remaining = set(d)
remaining.difference_update(keys)
for k in remaining:
d2[k] = d[k]
return d2


Expand Down
12 changes: 6 additions & 6 deletions toolz/tests/test_dicttoolz.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,16 +90,16 @@ def test_assoc(self):

def test_dissoc(self):
D, kw = self.D, self.kw
assert dissoc(D({"a": 1}), "a") == D({})
assert dissoc(D({"a": 1, "b": 2}), "a") == D({"b": 2})
assert dissoc(D({"a": 1, "b": 2}), "b") == D({"a": 1})
assert dissoc(D({"a": 1, "b": 2}), "a", "b") == D({})
assert dissoc(D({"a": 1}), "a") == dissoc(dissoc(D({"a": 1}), "a"), "a")
assert dissoc(D({"a": 1}), "a", **kw) == D({})
assert dissoc(D({"a": 1, "b": 2}), "a", **kw) == D({"b": 2})
assert dissoc(D({"a": 1, "b": 2}), "b", **kw) == D({"a": 1})
assert dissoc(D({"a": 1, "b": 2}), "a", "b", **kw) == D({})
assert dissoc(D({"a": 1}), "a", **kw) == dissoc(dissoc(D({"a": 1}), "a", **kw), "a", **kw)

# Verify immutability:
d = D({'x': 1})
oldd = d
d2 = dissoc(d, 'x')
d2 = dissoc(d, 'x', **kw)
assert d is oldd
assert d2 is not oldd

Expand Down