Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从元组创建嵌套字典_Python_Python 3.x_Dictionary - Fatal编程技术网

Python 从元组创建嵌套字典

Python 从元组创建嵌套字典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我正在尝试从元组创建嵌套字典。此元组的排列方式如下: content=(p0,a0,b0,c0,d0,p1,a1,b1,c1,d1,....) 我试图在嵌套字典中转换它,该字典的外观如下: my_dictionary=[{"p":"p0","a":"a0","b":"b0","c":"c0","d":"d0"}, "p":"p1","a":"a1","b":"b1","c":"c1","d":"d1"}, "p":"p2","a":"a2","b":"b2","c":"c2","d":"d2"

我正在尝试从元组创建嵌套字典。此元组的排列方式如下:

content=(p0,a0,b0,c0,d0,p1,a1,b1,c1,d1,....)
我试图在嵌套字典中转换它,该字典的外观如下:

my_dictionary=[{"p":"p0","a":"a0","b":"b0","c":"c0","d":"d0"},
"p":"p1","a":"a1","b":"b1","c":"c1","d":"d1"},
"p":"p2","a":"a2","b":"b2","c":"c2","d":"d2"},
...]

键总是相同的
键=[p,a,b,c,d]
。我的问题是,我不知道如何设置此循环以及如何格式化此循环以获取字典

基于对序列中的元素进行分组的惯用方法,我可以想到两种方法:

import itertools as it


content = range(50)
keys = ('p', 'a', 'b', 'c', 'd')

dicts = [dict(zip(keys, gr)) for gr in zip(*[iter(content)]*len(keys))]
print(dicts)

dicts2 = [dict(pairs) for pairs in zip(*[iter(zip(it.cycle(keys), content))]*len(keys))]
print(dicts2)
产生

[{'p': 0, 'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'p': 5, 'a': 6, 'b': 7, 'c': 8, 'd': 9}, {'p': 10, 'a': 11, 'b': 12, 'c': 13, 'd': 14}, {'p': 15, 'a': 16, 'b': 17, 'c': 18, 'd': 19}, {'p': 20, 'a': 21, 'b': 22, 'c': 23, 'd': 24}, {'p': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29}, {'p': 30, 'a': 31, 'b': 32, 'c': 33, 'd': 34}, {'p': 35, 'a': 36, 'b': 37, 'c': 38, 'd': 39}, {'p': 40, 'a': 41, 'b': 42, 'c': 43, 'd': 44}, {'p': 45, 'a': 46, 'b': 47, 'c': 48, 'd': 49}]

[{'p': 0, 'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'p': 5, 'a': 6, 'b': 7, 'c': 8, 'd': 9}, {'p': 10, 'a': 11, 'b': 12, 'c': 13, 'd': 14}, {'p': 15, 'a': 16, 'b': 17, 'c': 18, 'd': 19}, {'p': 20, 'a': 21, 'b': 22, 'c': 23, 'd': 24}, {'p': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29}, {'p': 30, 'a': 31, 'b': 32, 'c': 33, 'd': 34}, {'p': 35, 'a': 36, 'b': 37, 'c': 38, 'd': 39}, {'p': 40, 'a': 41, 'b': 42, 'c': 43, 'd': 44}, {'p': 45, 'a': 46, 'b': 47, 'c': 48, 'd': 49}]
第一种方法创建每个字典,将它从内容中获得的块与键配对

就性能而言

5.92 µs ± 42.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
第二种方法是,首先通过在键旁边重复键,将内容与键配对,然后将这些键分成若干块,并从中创建字典

至少需要稍微少一点

5.76 µs ± 46.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
注意:如果输入元素的数量不是键数量的倍数,可以修改第一个解决方案以适应部分字典

dicts = [dict((k,v) for k,v in zip(keys, gr) if v is not None) for gr in it.zip_longest(*[iter(content)]*len(keys))]
我理解向刚刚开始使用Python的人解释分块是如何工作的并不容易


如评论中所述,有关更多详细信息,请参阅此部分

这是另一种解决方案。基本上,您是在列表中按块前进,并以这种方式创建
dict
s。这不是最短的方法,但对于开发人员来说可能更容易理解

keys=('p','a','b','c','d')
索引=0
键长=长(键)
content_len=len(content)
输出=[]
而索引
您特别关注其中的哪一部分?请参见,例如。请注意,您想要的输出是一个字典列表;嵌套字典通常是一个字典,其值也是字典。以5的步幅遍历元组的索引,创建一个每5个元素的字典,并将它们附加到列表中。我是voting来结束这个。预期的输出是模糊的,没有任何尝试或努力的迹象。只是尝试了两种方法,它们都很好地工作。非常感谢Pynchia。第一周用Python编程:P。这也很有效,谢谢你cWallenpole!比前面的答案更容易理解。