Python 列表到字典的转换,每个键有多个值?
我有一个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
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']}