首页 > 解决方案 > 带有 `.add` 或 `.append` 的 for 循环的内联版本

问题描述

是否有一种干净的内联方式来定义具有或的for循环?例如,考虑以下循环:.add.appendfor

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 = ...

标签: pythonpython-3.xfor-loopinline

解决方案


我仍然认为您的第一种方法非常干净,比这个答案更好,但这是一个单线解决方案

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}})

推荐阅读