python - 使用字典理解压缩/转换嵌套列表

标签 python dictionary nested-lists dictionary-comprehension

所以我的数据结构像这样的嵌套列表

data = [['A', '1'], ['B', '2'], ['C', '3'], ['A', '-2'], ['B', '4'], ['C', '1'], ['A', '2'], ['B', '1'], ['C', '-5']]

我正在尝试将其转换为如下所示的输出

{'A': 1, 'C': -1, 'B': 7}

基本上总结所有 A、B、C,将输出作为字典。

我编写的代码给出了正确的答案

playerSum = {}
for ele in data:
    if ele[0] not in playerSum:
        playerSum[ele[0]] = int(ele[1])
    else:
        playerSum[ele[0]] += int(ele[1])

但是,我正在尝试将上面的代码块转换为字典理解。我主要了解如何做到这一点,但我不明白如何将 += 编写为字典理解。任何有关结构的指导都会很棒。

到目前为止我已经有了这个

playerSum = {ele[0]: int(ele[1]) if ele[0] not in playerSum else playerSum[ele[0]] += int(ele[1]) for ele in data}

编辑:@achampion 能够解决这个问题。谢谢!

{key: sum(int(v) for k, v in data if k==key) for key in set(k for k, _ in data)}

最佳答案

将其作为理解来进行是不切实际的。
作为练习,您可以使用协程为您进行计数,但您实际上创建了两次字典:

from collections import defaultdict
def count():
    cache = defaultdict(int)
    k, v = yield
    while True:
        cache[k] += v
        k, v = yield cache[k]

counter = count()  # Create coroutine
next(counter)      # Prime coroutine

data = [['A', '1'], ['B', '2'], ['C', '3'], ['A', '-2'], ['B', '4'],
        ['C', '1'], ['A', '2'], ['B', '1'], ['C', '-5']]

{k: counter.send((k, int(v))) for k, v in data}  # Meets the challenge :)

结果:

{'A': 1, 'B': 7, 'C': -1}

或者一个真正丑陋的单行代码,不需要协程并且不是二次的(不是推导式):

>>> reduce(lambda d, (k,v): d.__setitem__(k, d.get(k,0)+int(v)) or d, data, {})  # Py2.7
{'A': 1, 'B': 7, 'C': -1}

最后是一个基于@Prune 的非常低效但真实的字典理解:

>>> {key: sum(int(v) for k, v in data if k==key) for key in set(k for k, _ in data)}
{'A': 1, 'B': 7, 'C': -1}

关于python - 使用字典理解压缩/转换嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617112/

相关文章:

Python:正则表达式仅找到所搜索字符串的一部分

python - 在文件夹中安装所有 .msi 文件

c# - 如何在充满字典的ComboBox中获取SelectedValue的值

java - 使用 JSP 访问封装在 Map 内的对象的 getter 方法

python - Django REST 嵌套路由器

python - 更新Python程序中的时钟而不创建新行

python - 需要处理keyerror异常python

python - 删除子列表重复项,包括反向

python - 根据第一个元素组合嵌套列表

python - 嵌套列表代码中缺少第一个列表