将长度为n和2n的两个数组压缩成一个字典

2024-04-20 07:45:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我在和这个小东西斗争。假设:

field_name = ['name', 'age', 'sex']
field_values = ['john', '24', 'M', 'jane', '26', 'F']

输出类似于:

{  'name': ['john','jane'],
   'age': ['24', '26'],
   'sex': ['M', 'F']
}

正在压缩:

dict_sample_fields = dict(zip(field_name, field_value))
#output
{  'name': 'john',
   'age': '24',
   'sex': 'M'
}

如何实现值的循环压缩?你知道吗

我可以通过多个循环来实现这一点。一个班轮会很酷:D


Tags: samplenamefieldfieldsoutputagevaluezip
3条回答

假设您的值被3个索引的距离隔开,您可以这样做,而不必使用任何zip作为单个for循环。使用enumerate可以访问索引,您可以利用索引访问列表值。如果要使其更通用,可以使用字段数(“键”)作为偏移量。你知道吗

dict_sample_fields = {}

offset = len(field_name)

for i, key in enumerate(field_name):
    dict_sample_fields[key] = [field_values[i], field_values[i+offset]]

输出

{'name': ['john', 'jane'], 'age': ['24', '26'], 'sex': ['M', 'F']}

把它们放在一起

dict_sample_fields = {key: [field_values[i], field_values[i+3]] for i, key in enumerate(field_name)}

其实很简单,你甚至不需要zip

{k: field_values[i::len(field_name)] for i, k in enumerate(field_name)}

# {'name': ['john', 'jane'], 'age': ['24', '26'], 'sex': ['M', 'F']}

利用切片list的步骤,从field_name的索引开始即可。你知道吗

我们可以使用^{}中的^{}函数或itertools文档中的同名函数recipe对值进行分组。然后这些组可以用zip进行转位。你知道吗

>>> from more_itertools import grouper                                                                                            
>>>                                                                                                                               
>>> field_name = ['name', 'age', 'sex']                                                                                           
>>> field_values = ['john', '24', 'M', 'jane', '26', 'F']                                                                         
>>>                                                                                                                               
>>> dict(zip(field_name, map(list, zip(*grouper(len(field_name), field_values)))))                                                              
{'age': ['24', '26'], 'name': ['john', 'jane'], 'sex': ['M', 'F']}

这不会产生中间列表。你知道吗

相关问题 更多 >