在循环中为键分配值

时间:2017-03-19 12:13:20

标签: python list loops dictionary

我有一个包含键的字典,但没有值:

> {'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.}

我应该直接在循环中进行值赋值吗?

3 个答案:

答案 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())}

希望这有帮助!