2017-03-19 50 views
1

我與它鍵的字典鍵,但沒有值:分配值在循環

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

我應該直接在循環中進行值賦值嗎?

+2

字典是無序的,所以你需要在你的字典上施加一些特定的順序,然後才能分配這些值。 –

+0

問題未指定。你有一個固定的順序應該分配結果,還是你想在循環的每次迭代中分配給鍵'row'? – timgeb

回答

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()功能:

+0

太棒了!非常感謝 – feedthemachine

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是你的字典要根據需要分配到,變革。)

-1

要跟隨您所分享的輸入結構 您可以使用詞典理解。 也就是,

{k:result[index] for index, k in enumerate(yourdict.keys())} 

yourdict是你在你的問題中給出的字典。

另一種解決方案是遵循Markus的答案。

dict(zip(yourdict.keys(),result) 

希望這有助於!