带有 .add 或 .append 的 for 循环的内联版本
Inline version of a for loop with `.add` or `.append`
是否有一种简洁的内联方式来定义具有 .add
或 .append
的 for
循环?例如,考虑以下 for
循环:
import collections
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = collections.defaultdict(set)
for k, v in s:
d[k].add(v)
我可以想到像下面的代码一样内联写,但是看起来不太干净:
_ = [d[k].add(v) for k, v in s]
是否有更好的方法,例如使用itertools.accumualte
?像
d = ...
我仍然认为你的第一种方法非常干净并且比这个答案更好,但这是一个单行解决方案:
import itertools
...
d = {k: set(v for _, v in g) for k, g in itertools.groupby(sorted(s), lambda x: x[0])}
print(d)
输出:
{'blue': {2, 4}, 'red': {1, 3}}
另一种方法(不是一行):
d = collections.defaultdict(set)
def change_dict(k, v):
d[k].add(v)
list(itertools.starmap(change_dict, s)) # list is to call iterator
print(d)
输出:
defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})
使用itertools.accumulate
。可能效率不高,但解决了问题。
d = itertools.accumulate(
s,
lambda d, kv: dict(d, **{kv[0]: d.get(kv[0], set()).union({kv[1]})}),
initial=dict())
d = list(d)[-1]
是否有一种简洁的内联方式来定义具有 .add
或 .append
的 for
循环?例如,考虑以下 for
循环:
import collections
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = collections.defaultdict(set)
for k, v in s:
d[k].add(v)
我可以想到像下面的代码一样内联写,但是看起来不太干净:
_ = [d[k].add(v) for k, v in s]
是否有更好的方法,例如使用itertools.accumualte
?像
d = ...
我仍然认为你的第一种方法非常干净并且比这个答案更好,但这是一个单行解决方案:
import itertools
...
d = {k: set(v for _, v in g) for k, g in itertools.groupby(sorted(s), lambda x: x[0])}
print(d)
输出:
{'blue': {2, 4}, 'red': {1, 3}}
另一种方法(不是一行):
d = collections.defaultdict(set)
def change_dict(k, v):
d[k].add(v)
list(itertools.starmap(change_dict, s)) # list is to call iterator
print(d)
输出:
defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})
使用itertools.accumulate
。可能效率不高,但解决了问题。
d = itertools.accumulate(
s,
lambda d, kv: dict(d, **{kv[0]: d.get(kv[0], set()).union({kv[1]})}),
initial=dict())
d = list(d)[-1]