Выполнить действия со значениями словаря, которые соответствуют элементам в списке? - PullRequest
2 голосов
/ 28 июля 2011

У меня есть словарь с 46 000 пар ключ: значение, где каждый ключ имеет список из 3 элементов в качестве значений:

my dict = {key1: ['A', 'B', 'C'], key2: ['B', 'A', 'G'], key3: ['Z', 'H', 'I']......}

У меня есть список с сотнями значений:

L1 = ['A', 'A', 'B', 'D', ......]

Как перебрать список L1 и для каждого элемента в L1 сопоставить каждое значение словаря, где значение [0] соответствует элементу списка? Затем я хочу выполнить другие операции со значением [1] и значением [2] словаря только с теми парами ключ: значение, в которых элемент списка соответствует значению [0] в словаре.

В приведенном выше примере первый элемент в L1 - 'A' будет соответствовать только key1: ['A', 'B', 'C'].

Кажется, я не могу найти способ сделать это? Спасибо за помощь!

Ответы [ 4 ]

3 голосов
/ 28 июля 2011

Без каких-либо ярлыков вы могли бы написать что-то вроде этого:

#!/usr/bin/env python

d = {
    'key1' : ['A', 'B', 'C'], 
    'key2' : ['B', 'A', 'G'], 
    'key3' : ['Z', 'H', 'I']
}

l = ['A', 'A', 'B', 'D']

uniq_l = set(l) # you don't need to check duplicates twice

for key, value in d.items():
    if value[0] in uniq_l:
        print "Match", key, value

# Output:
# Match key2 ['B', 'A', 'G']
# Match key1 ['A', 'B', 'C']
1 голос
/ 28 июля 2011

Вы писали: "Как перебрать список L1 ..." , поэтому я полагаю, что выполнение действий в таком порядке важно для вас:

from collections import defaultdict

my_dict = {
    'key1': ['A', 'B', 'C'],
    'key2': ['B', 'A', 'G'],
    'key3': ['Z', 'H', 'I'],
    'key4': ['A', 'Q', 'W'],
}

L1 = ['A', 'A', 'B', 'D']

lookup = defaultdict(list)

for items in my_dict.itervalues():
    lookup[items[0]].append(items[1:])

for key in L1:
    for items in lookup[key]:
        print items

дает:

['B', 'C']
['Q', 'W']
['B', 'C']
['Q', 'W']
['A', 'G']

Python 2.7, кстати.

0 голосов
/ 28 июля 2011

Я бы наверное построил вспомогательный dict

>>> mydict = {'key1': ['A', 'B', 'C'], 'key2': ['B', 'A', 'G'], 'key3': ['Z', 'H', 'I']}
>>> from collections import defaultdict>>> mydict_aux = defaultdict(list)
>>> for k,v in mydict.items():
...     mydict_aux[v[0]].append(k)
... 
>>> mydict_aux['A']
['key1']
0 голосов
/ 28 июля 2011
>>> my_dict
{'key3': ['Z', 'H', 'I'], 'key2': ['B', 'A', 'G'], 'key1': ['A', 'B', 'C']}
>>> L1 
['A', 'A', 'B', 'D']
>>> {i: {key: value for key, value in my_dict.iteritems() if value[0] == i} for i in set(L1)}
{'A': {'key1': ['A', 'B', 'C']}, 'B': {'key2': ['B', 'A', 'G']}, 'D': {}}

Это означает, что 'A' соответствует {'key1': ['A', 'B', 'C']} и т. Д. Это диктат из-за 46000 значений, я думал, что может быть более одного совпадения.

...