代码之家  ›  专栏  ›  技术社区  ›  user2725109

Python内联版本的for循环,带有`。加上`或`。附加`

  •  0
  • user2725109  · 技术社区  · 5 年前

    有没有一种干净的内联方式来定义 for 循环 .add .append ? 例如,考虑以下内容 对于 循环:

    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 = ...
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Alperen    5 年前

    我仍然认为你的第一种方法非常干净,比这个答案更好,但这里有一个例子 单线解决方案 :

    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}})
    
        2
  •  -1
  •   user2725109    5 年前

    使用 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]