我有一个包含键的字典,但没有值:
> {'GROUP': '?', 'THREAD': '?', 'SEQUENCE': '?', 'BYTES': '?', 'BLOCKSIZE': '?'}
我还有一个返回值列表的循环:
for row in rng:
result = [d[row] for d in inp]
print(result)
> ['1', '2', '3']
> ['1', '1', '1']
> ['346', '347', '348']
> ['52428800', '52428800', '52428800']
> ['512', '512', '512']
我如何将db.keys分配给db.values,因此输出如下所示:
{'GROUP': ['1', '2', '3'], THREAD': ['1', '1', '1'], 'SEQUENCE': ['1', '1', '1'], 'BYTES': ['52428800', '52428800', '52428800'], etc.}
我应该直接在循环中进行值赋值吗?
答案 0 :(得分:1)
由于字典是无序的(您定义的键是按随机顺序排列的,无论您将它们定义在哪个顺序中),都无法知道要将哪个结果列表分配给哪个键。
我要做的是创建一个列表或密钥元组以保持顺序:
keys = ('GROUP', 'THREAD', 'SEQUENCE', 'BYTES', 'BLOCKSIZE')
然后将所有值提取到另一个列表中(或者更好的是,生成器):
values = ([d[row] for d in inp] for row in rng)
所以现在你有两个相同顺序的迭代,一个带有键,一个带有相应的值。这是他们看起来像列表(values
是一个生成器,所以我们无法真正打印值):
>>> print(keys)
['GROUP', 'THREAD', 'SEQUENCE', 'BYTES', 'BLOCKSIZE']
>>> print(values)
[['1', '2', '3'], ['1', '1', '1'], ['346', '347', '348'], ['52428800', '52428800', '52428800'], ['512', '512', '512']]
现在使用内置的zip()
函数构建最终结果字典很容易:
data = dict(zip(keys, values))
答案 1 :(得分:0)
如果要分配的键的顺序是固定的,那么构建一个迭代器,以任何你想要的顺序吐出键名。
keynames = iter(['GROUP', 'THREAD', 'SEQUENCE', 'BYTES', ...])
for row in rng:
# your code
...
# new code
key = next(keynames)
d[key] = result
如果要在每次迭代中分配键row
,只需执行此操作:
for row in rng:
# your code
...
# new code
d[row] = result
(假设d
是您要分配的词典,请根据需要进行更改。)
答案 2 :(得分:-1)
要遵循您所分享的输入结构, 你可以使用dict理解。 也就是说,
reader.onload()
yourdict是您在问题中提供的词典。
另一个解决方案是遵循Markus的回答。
{k:result[index] for index, k in enumerate(yourdict.keys())}
希望这有帮助!