对匹配列表项的字典值进行操作?

2 投票
4 回答
4754 浏览
提问于 2025-04-16 22:24

我有一个字典,里面有46,000对键值对,每个键对应的值是一个包含3个项目的列表:

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

我还有一个包含数百个值的列表:

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

我想要遍历这个列表L1,对于L1中的每一个项目,找到字典中那些值的第一个项目(value[0])和列表中的项目相匹配的键值对。然后,我想对这些匹配的字典项的值的第二个和第三个项目(value[1]和value[2])进行其他操作。

在上面的例子中,L1中的第一个项目'A'只会匹配到key1: ['A', 'B', 'C']

我似乎找不到办法来实现这个?谢谢你的帮助!

4 个回答

0
>>> 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']}这样的内容匹配。之所以用字典(dict),是因为在46000个值中,我觉得可能会有多个匹配的结果。

1

你写道:"我该如何遍历列表 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。

3

没有任何简化的方法,你可以写成这样:

#!/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']

撰写回答