python - 带有 `.add` 或 `.append` 的 for 循环的内联版本
问题描述
是否有一种干净的内联方式来定义具有或的for
循环?例如,考虑以下循环:.add
.append
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}})
推荐阅读
- r - 如何在迭代中使用 mutate 函数
- mysql - 使用IP地址指定的用户,为什么我无法远程连接到mysql服务器?
- javascript - 使用 Axios 在两个地方敲出错误消息
- python - 如何使用 selenium 在具有 AJAX onchange 属性的下拉菜单中选择一个选项
- couchbase - 使用数组函数从数组中删除元素不起作用
- javascript - 带有字符串值的 Google 脚本 .setFormula 错误
- python - NLTK Punkt Tokenizer:如何自定义句尾字符?
- laravel - 渴望加载媒体网址 - laravel-medialibrary
- python - 同一组内的时间戳差异
- django - 使用 python 3.8 在 Windows 10 上安装 django 频道和扭曲的问题