Как мне объединить список значений в словарь Python? - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь присоединить список к словарю в Python 3 и вернуть сумму значений ключа.

Пока я не могу соединить два, я пытался использовать getи set и не удается.

Я также пробовал цикл for с установленным связыванием listy и dict2, например:

dict2 = {
1: "A",
2: "B",
3: "C"
}

listy = ['A', 'M', 'B', 'A']

for k in dict2:
    if set(listy) & set(dict2[value]):
        print(dict2.key)

Это ошибка, которую я получаю в IPython:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-291-5a5e2eb8d7f8> in <module>
     10 
     11 for k in dict2:
---> 12     if set(listy) & set(dict2[value]):
     13         print(dict2.key)
     14 

TypeError: unhashable type: 'list'

Ответы [ 3 ]

3 голосов
/ 19 мая 2019

Вы можете использовать список-понимание:

[x for x in listy if x in set(dict2.values())]

В коде :

dict2 = {
1: "A",
2: "B",
3: "C"
}

listy = ['A', 'M', 'B', 'A']

print([x for x in listy if x in set(dict2.values())])
# ['A', 'B', 'A']
0 голосов
/ 19 мая 2019

Ваша задача будет легче, если вы перевернете ключи и значения в вашем словаре.Я предполагаю, что нет повторяющихся значений.

dict2 = {1: "A", 2: "B", 3: "C"}
lookup = {value: key for key, value in dict2.items()}

Теперь lookup равно {'A': 1, 'B': 2, 'C': 3}.Теперь вы можете перебрать список:

listy = ['A', 'M', 'B', 'A']
result = []
for key in listy:
    if key in lookup:
        result.append(key)

Теперь result равно ['A', 'B', 'A'].Код будет короче с пониманием списка:

result = [key for key in listy if key in lookup]

Насколько я понял вопрос, вы хотите получить сумму ключей в dict2 для каждой записи в listy, которая имеет соответствующийзначение в dict2.Если вы создали словарь lookup, вы можете выполнить следующие действия, чтобы получить отдельные значения:

[lookup.get(key, 0) for key in listy]
# -> [1, 0, 2, 1]

Если ключ отсутствует в словаре, он получает значение по умолчанию 0.

Получить сумму сейчас легко

sum(lookup.get(key, 0) for key in listy)
# -> 4
0 голосов
/ 19 мая 2019

Вы, вероятно, хотели использовать dict[k] вместо dict2[value]

Также записи вашего словаря содержат отдельные значения (не списки), поэтому вы можете использовать оператор in:

например:

 # if listy is a dictionary or a small list, you don't need to build a set 

 for key,value in dict2.items():
    if value in listy:
        print(key)

или:

 # If listy is a large list, you should build a set only once 

 listySet = set(listy)
 for key,value in dict2.items():
    if value in listySet:
        print(key)

Если у вас есть много кода, который нужно выполнить с «объединенными» данными, вы можете структурировать условие следующим образом:

 for key,value in dict2.items():
    if value not in listy: continue
    print(key)
    ... do more stuff ...

Если вы ищете только сумму, вы можете сделать это более напрямую:

# counting sum of dict2 keys matching each value in listy  
# select sum(dict2.key) from listy join dict2 where dict2.value = listy.value
# (note that an inverted dict2 would be better suited for that)

result = sum(key*listy.count(value) for key,value in dict2.items())

# counting sum of keys in dict2 that have a value in listy 
# select sum(dict2.key) from dict2 where exists listy.value = dict2.value

result = sum(key for key,value in dict2.items() if value in listy)

Короче говоря, вы должны реализовать логику компоновки, которую оптимизатор запросов СУБД обычно делает для вас в SQL.

...