带有 .add 或 .append 的 for 循环的内联版本

Inline version of a for loop with `.add` or `.append`

是否有一种简洁的内联方式来定义具有 .add.appendfor 循环?例如,考虑以下 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]