Как превратить значение dict из списка в кортеж, чтобы затем инвертировать слово - PullRequest
1 голос
/ 31 мая 2019

Мое назначение требует создания словаря со списком значений для каждого ключа.Затем он предоставляет функцию инвертирования и просит изменить функцию, чтобы каждый элемент в списке был новым ключом.Мое понимание таково.a = {'a': ['2', '3', '4'], 'b': ['1', '5', '6']} b = {'2': 'a',«3»: «a», «4»: «a», «1»: «b», «5»: «b», «6»: «b»}

Я создал тестсловарь с кортежами вместо списков, и я смог инвертировать их, но я не знаю, как превратить списки в словаре в кортежи, а затем в отдельные элементы, которые соответствуют одному и тому же значению.Я смотрел учебные пособия по YouTube и пытался найти его в Google (включая переполнение стека), но не могу понять, как его завершить.На данный момент я даже ничего не знаю - я определенно был бы признателен за любые объяснения, поскольку я чувствую себя полностью сбитым с толку.


def invert_dict(d):
     inverse = dict()
     for key in d:
          val = d[key]
          if val not in inverse:
               inverse[val] = [key]
          else:
               inverse[val].append(key)
     return inverse

#my initial dictionary
work_contacts={'Lauren' : '617-111-2222', 'Sana' : '781-234-1212', 'Kelly': '845-234-1515', 'Jose' : '946-999-3210', 'Sabrina' : '617-222-5656', 'Shirika' : '410-231-9090', 'Rachel': '823-432-2121'}

c=invert_dict(work_contacts)
c
{'617-111-2222': ['Lauren'], '781-234-1212': ['Sana'], '845-234-1515': ['Kelly'], '946-999-3210': ['Jose'], '617-222-5656': ['Sabrina'], '410-231-9090': ['Shirika'], '823-432-2121': ['Rachel']}
c['617-111-2222'] #calling the first key
['Lauren']

#the dictionary for the assignment
work_contacts={'Lauren' : ['617-111-2222', 'lauren@company.org'], 'Sana' : ['781-234-1212', 'sana@company.org'], 'Kelly': ['845-234-1515', 'kelly@company.org'], 'Jose' : ['946-999-3210', 'jose@company.org'], 'Sabrina' : ['617-222-5656', 'sabrina@company.org'], 'Shirika' : ['410-231-9090', 'shirika@comoany.org'], 'Rachel': ['823-432-2121', 'rachel@company.org']}

#the error comes back like this
invert_dict(work_contacts)
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    invert_dict(work_contacts)
  File "<pyshell#2>", line 5, in invert_dict
    if val not in inverse:
TypeError: unhashable type: 'list'

#I tried to turn the lists into tuples
def l_t(s):
    final = []
    for k, v in test.items():
        if v in final:
            final.append(k)
        final = tuple(final)
    return s

l_t(work_contacts)
{'Lauren': ['617-111-2222', 'lauren@company.org'], 'Sana': ['781-234-1212', 'sana@company.org'], 'Kelly': ['845-234-1515', 'kelly@company.org'], 'Jose': ['946-999-3210', 'jose@company.org'], 'Sabrina': ['617-222-5656', 'sabrina@company.org'], 'Shirika': ['410-231-9090', 'shirika@comoany.org'], 'Rachel': ['823-432-2121', 'rachel@company.org']}

def l_t(s):
    p=s
    final = []
    for k, v in test.items():
        if v in final:
            final.append(k)
        final = tuple(final)
    return p

l_t(work_contacts)
{'Lauren': ['617-111-2222', 'lauren@company.org'], 'Sana': ['781-234-1212', 'sana@company.org'], 'Kelly': ['845-234-1515', 'kelly@company.org'], 'Jose': ['946-999-3210', 'jose@company.org'], 'Sabrina': ['617-222-5656', 'sabrina@company.org'], 'Shirika': ['410-231-9090', 'shirika@comoany.org'], 'Rachel': ['823-432-2121', 'rachel@company.org']}

`def l_t(s):
    p=s
    final = []
    for k, v in p.items():
        if v in final:
            final.append(k)
        final = tuple(final)
    return p

l_t(work_contacts)
{'Lauren': ['617-111-2222', 'lauren@company.org'], 'Sana': ['781-234-1212', 'sana@company.org'], 'Kelly': ['845-234-1515', 'kelly@company.org'], 'Jose': ['946-999-3210', 'jose@company.org'], 'Sabrina': ['617-222-5656', 'sabrina@company.org'], 'Shirika': ['410-231-9090', 'shirika@comoany.org'], 'Rachel': ['823-432-2121', 'rachel@company.org']}

#I then tried to tuple the values 
tuple(work_contacts.values())
(['617-111-2222', 'lauren@company.org'], ['781-234-1212', 'sana@company.org'], ['845-234-1515', 'kelly@company.org'], ['946-999-3210', 'jose@company.org'], ['617-222-5656', 'sabrina@company.org'], ['410-231-9090', 'shirika@comoany.org'], ['823-432-2121', 'rachel@company.org'])

#I have generated much more code with error messages, as below
b=invert_dict(test)
b
{(2, 'al', 3): ['a'], ('we', 'as', 4): ['blue']}

b[2]
Traceback (most recent call last):
  File "<pyshell#145>", line 1, in <module>
    b[2]
KeyError: 2
b(2)
Traceback (most recent call last):
  File "<pyshell#146>", line 1, in <module>
    b(2)
TypeError: 'dict' object is not callable
b(2, 'al', 3)
Traceback (most recent call last):
  File "<pyshell#147>", line 1, in <module>
    b(2, 'al', 3)
TypeError: 'dict' object is not callable
b[1]
Traceback (most recent call last):
  File "<pyshell#148>", line 1, in <module>
    b[1]
KeyError: 1```

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Я полагаю, вы спрашиваете, как преобразовать invert_dict в функцию, которая будет работать со вторым work_contacts словарем, со списками в качестве значений. Если нет, игнорируйте этот ответ!

Давайте посмотрим на функцию:

def invert_dict(d):
     inverse = dict()
     for key in d:
          val = d[key]
          if val not in inverse:
               inverse[val] = [key]
          else:
               inverse[val].append(key)
     return inverse

Если d имеет списки в качестве значений, то val будет списком. Эта строка:

if val not in inverse:

где ваша функция выдает ошибку. Списки нельзя использовать в качестве ключей в словарях; в жаргоне Python, list - тип, который не подлежит изменению. Вот на что жалуется ошибка.

Если вы хотите, чтобы ключи в инвертированном словаре были элементами списка, а не самого списка, вам просто нужно пройтись по списку и сделать то же самое с его элементами, что вы делали с оригинальным val. Попробуйте что-нибудь с участием:

val_list = d[key]
for val_element in val_list:
     if val_element not in inverse:
          # you do the rest!
0 голосов
/ 31 мая 2019

Мне не понятно, что вы хотите решить.

Однако, если вы пытаетесь преобразовать следующее

{'a': [2, 3, 5], 'b': [7,11]} => {2: ['a'], 3: ['a'], 5: ['a'], 7: ['b'], 11: ['b']}

Тогда вы можете использовать следующее

{v1: [k] for k, v in original_dict.items() for v1 in v}

некоторые дополнительные слова чтобы перевернуть словарь, я перебираю исходный словарь согласно

for k, v in original_dict.items() => ('a', [2, 3, 5]), ('b', [7,11])

второй шаг - перебрать значения, v

[m for k in [[1,2], [3,4]] for m in k] => [1,2,3,4]

Этот шаг также показывает, как работает понимание списка - где мы можем перебирать вложенные списки.

Теперь у вас есть все инструменты, чтобы увидеть, как вы можете использовать ту же логику для создания словаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...