列表到字典的转换,每个键有多个值?

2025-02-21 08:50:00
admin
原创
72
摘要:问题描述:我有一个包含键/值对的 Python 列表:l = [[1, 'A'], [1, 'B'], [2, 'C']] 我想将列表转换为字典,其中每个键的多个值将聚合为一个元组:{1: ('A', 'B'), 2: ('C',)} 迭代解决方案很简单:l = [[1, 'A'], [1, 'B'], [2...

问题描述:

我有一个包含键/值对的 Python 列表:

l = [[1, 'A'], [1, 'B'], [2, 'C']]

我想将列表转换为字典,其中每个键的多个值将聚合为一个元组:

{1: ('A', 'B'), 2: ('C',)}

迭代解决方案很简单:

l = [[1, 'A'], [1, 'B'], [2, 'C']]
d = {}
for pair in l:
    if pair[0] in d:
        d[pair[0]] = d[pair[0]] + tuple(pair[1])
    else:
        d[pair[0]] = tuple(pair[1])

print(d)

{1: ('A', 'B'), 2: ('C',)}

有没有更优雅、更 Pythonic 的解决方案来完成这个任务?


解决方案 1:

from collections import defaultdict

d1 = defaultdict(list)

for k, v in l:
    d1[k].append(v)

d = dict((k, tuple(v)) for k, v in d1.items())

d现在包含{1: ('A', 'B'), 2: ('C',)}

d1是一个临时的 defaultdict,其值是列表,将在最后一行转换为元组。这样,您就可以将其附加到列表中,而不是在主循环中重新创建元组。

解决方案 2:

使用列表而不是元组作为字典值:

l = [[1, 'A'], [1, 'B'], [2, 'C']]
d = {}
for key, val in l:
    d.setdefault(key, []).append(val)

print(d)

与使用 相比,使用普通字典通常更可取defaultdict,特别是如果您只构建一次然后在代码中继续从中读取:

首先,普通词典的构建和访问速度更快。

其次,更重要的是,如果您尝试访问不存在的键,而不是默默地创建该键,则后续的读取操作将出错。普通字典允许您明确说明何时要创建键值对,而defaultdict对于任何类型的访问,字典始终会隐式地创建它们。

解决方案 3:

这种方法相对高效,而且非常紧凑:

reduce(lambda x, (k,v): x[k].append(v) or x, l, defaultdict(list))

在 Python3 中这变成(使导出明确):

dict(functools.reduce(lambda x, d: x[d[0]].append(d[1]) or x, l, collections.defaultdict(list)))

请注意,reduce 已移至 functools,并且 lambda 不再接受元组。此版本在 2.6 和 2.7 中仍有效。

解决方案 4:

输入列表中的键是否已经排序?如果是,则有一个实用的解决方案:

import itertools

lst = [(1, 'A'), (1, 'B'), (2, 'C')]
dct = dict((key, tuple(v for (k, v) in pairs)) 
           for (key, pairs) in itertools.groupby(lst, lambda pair: pair[0]))
print dct
# {1: ('A', 'B'), 2: ('C',)}

解决方案 5:

我创建了一个值列表,如下所示:

performance_data = driver.execute_script('return window.performance.getEntries()')  

然后我必须将数据(名称和持续时间)存储在具有多个值的字典中:

dictionary = {}
    for performance_data in range(3):
        driver.get(self.base_url)
        performance_data = driver.execute_script('return window.performance.getEntries()')
        for result in performance_data:
            key=result['name']
            val=result['duration']
            dictionary.setdefault(key, []).append(val)
        print(dictionary)

解决方案 6:

我的数据在 Pandas.DataFrame 中

myDict = dict()

for idin set(data['id'].values):
    temp = data[data['id'] == id]
    myDict[id] = temp['IP_addr'].to_list()
    
myDict

给了我一个包含键、ID、映射到 >= 1 IP_addr的字典。第一个 IP_addr 是有保证的。我的代码应该可以工作,即使temp['IP_addr'].to_list() == []

{'fooboo_NaN': ['1.1.1.1', '8.8.8.8']}

解决方案 7:

我将把两个硬币投入到这个精彩的讨论中)我试图想出一个只有标准库的一行解决方案。请原谅我导入了两个多余的代码。也许下面的代码可以以令人满意的质量解决问题(对于 python3):

from functools import reduce
from collections import defaultdict

a = [1, 1, 2, 3, 1]
b = ['A', 'B', 'C', 'D', 'E']

c = zip(a, b)

print({**reduce(lambda d,e: d[e[0]].append(e[1]) or d, c, defaultdict(list))})
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3970  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2740  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   79  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   87  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   74  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用