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

Python 列表到字典的转换,每个键有多个值?,python,list,dictionary,type-conversion,Python,List,Dictionary,Type Conversion,我有一个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(pai

我有一个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',)}
对于这项任务,有没有更优雅、更通俗的解决方案

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,列表作为值,将在最后一行转换为元组。通过这种方式,您将附加到列表,而不是在主循环中重新创建元组。

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

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

print(d)

使用普通字典通常比使用
defatultdict
更可取,特别是如果您只构建了一次字典,然后在以后的代码中继续阅读它。首先,普通字典的构建和访问速度更快。第二,也是更重要的一点,如果您尝试访问一个不存在的密钥,而不是以静默方式创建该密钥,则后面的读取操作将出错。普通字典允许您显式地声明何时要创建键值对,而
defaultdict
总是隐式地在任何类型的访问中创建键值对。

键是否已在输入列表中排序?如果是这种情况,您有一个功能解决方案:

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

此方法相对有效且非常紧凑:

reduce(lambda x, (k,v): x[k].append(v) or x, l, defaultdict(list))
在Python3中,这变成(使导出显式):


请注意,reduce已经转移到functools,lambda不再接受元组。此版本在2.6和2.7中仍然有效。

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

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)

我的数据在一个Pandas.DataFrame中

myDict=dict()
对于idin集合(数据['id']。值):
临时=数据[数据['id']==id]
myDict[id]=temp['IP\u addr'].to\u list()
麦迪克特
给了我一个密钥,ID,映射到>=1 IP地址的Dict。第一个IP地址是有保证的。我的代码应该可以工作,即使
temp['IP\u addr']。to\u list()=[]

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

如果您
import操作符
,则可以编写
itertools.groupby(sorted(lst)、operator.itemgetter(0))
Nice,但在python 3.5或更高版本中无效
{'fooboo_NaN': ['1.1.1.1', '8.8.8.8']}