Словарь, изменяющий много значений на много ключей - PullRequest
1 голос
/ 15 декабря 2011

Мне было просто интересно, есть ли в чудесном мире Python какой-нибудь способ перейти от чего-то вроде этого:

dict1 = {'a': [1,2,3], 'b': [4,5,6]}

к

dict2 = {'a':1, 'a':2, 'a':3,'b':4, 'b': 5, 'b': 6]

или эквивалентному, порядокне имеет значения, но мне нужен какой-то способ разложения dict1 на что-то, в котором я могу присвоить числовые значения индексам нового списка и ключам в качестве фактических значений этих индексов, например, dict1 превратится в:

[0, a, a, a, b, b, b] 

Буду признателен за любую помощь, хотя чем больше идиотских доказательств ответы, тем лучше

Я в долгу перед вами.

Ответы [ 2 ]

5 голосов
/ 15 декабря 2011

Ваш dict2 не имеет смысла, потому что ключи словаря должны быть уникальными.

Я почти уверен, что вы можете получить то, что вы хотите, итерируя по dict1.items(), но мне нужно еще кое-что прояснить, как выглядит ожидаемый список вывода ... в вашем примере a и b не определены и Я не знаю, что представляет собой 0 в начале.

Возможно, вы хотели что-то подобное?

dict2 = {}
for k,v in dict1.items():
  for x in v:
    dict2[x] = k

Это даст вам dict2 как {1: 'a', 2: 'a', 3: 'a', 4: 'b', 5: 'b', 6: 'b'}. Имейте в виду, что дублирующиеся записи в распакованных значениях dict1 могут быть перезаписаны этим циклом.


Только для дерьма и хихиканья, то же самое в 1 строке, что и непонятное понимание диктата :

{x: k for (k,v) in dict1.items() for x in v}

2 голосов
/ 15 декабря 2011

Если значения представляют собой индексы, то:

import itertools

dict1 = {'a': [1,2,3], 'b': [4,5,6]}

L = [None]*(max(itertools.chain(*dict1.values())) + 1)
for word, indexes in dict1.items():                          
    for i in indexes:                                     
        L[i] = word
print(L)
# -> [None, 'a', 'a', 'a', 'b', 'b', 'b']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...