Python字典理解非常

2024-04-19 00:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典d1和一个列表l1。在

字典键是字符串,值是我自己定义的对象。如果有帮助,我可以更详细地描述对象,但是现在,对象有一个列表属性names,并且{}的一些元素可能出现在l1中,也可能不会出现。在

我想做的是丢弃字典d1的任何元素,其中该元素中对象的name属性不包含{}中出现的任何元素。在

举个小例子:

l1 = ['cat', 'dog', 'mouse', 'horse', 'elephant', 
      'zebra', 'lion', 'snake', 'fly']

d1 = {'1':['dog', 'mouse', 'horse','orange', 'lemon'],
      '2':['apple', 'pear','cat', 'mouse', 'horse'], 
      '3':['kiwi', 'lime','cat', 'dog', 'mouse'], 
      '4':['carrot','potato','cat', 'dog', 'horse'], 
      '5':['chair', 'table', 'knife']}

因此,生成的字典或多或少是相同的,但是每个列表的元素将是从1到{}的键值对,不包括水果和蔬菜,并且不会包含第五个键值par,因为没有家具值出现在l1中。在

像这样的一个字典/I用来做这个列表:

^{pr2}$

这似乎是可行的,但对于大字典,7000多个条目,大约需要20秒来完成。就其本身而言,并不可怕,但我需要在一个循环中执行此操作,该循环将迭代10000次,因此目前不可行。有什么关于如何快速完成的建议?在


Tags: 对象字符串元素l1列表字典属性定义
3条回答
l1 = ['cat', 'dog', 'mouse', 'horse', 'elephant', 
      'zebra', 'lion', 'snake', 'fly']

d1 = {'1':['dog', 'mouse', 'horse','orange', 'lemon'],
      '2':['apple', 'pear','cat', 'mouse', 'horse'], 
      '3':['kiwi', 'lime','cat', 'dog', 'mouse'], 
      '4':['carrot','potato','cat', 'dog', 'horse'], 
      '5':['chair', 'table', 'knife']}

def gen_items(valid_name_set, d):
    for k, v in d.iteritems():
        intersection = valid_name_set.intersection(v)
        if intersection: # not empty
            yield (k, intersection)

print dict(gen_items(set(l1), d1))

输出:

^{pr2}$

或者:

from itertools import ifilter
from operator import itemgetter
set_l1 = set(l1)
d2 = dict(ifilter(itemgetter(1), 
                  ((k, set_l1.intersection(v)) for k, v in d1.iteritems())))

{{1>计算列表中每个值的交集。对于集合交集使用列表是相当低效的,因为涉及到线性搜索。您应该将l1转换为一个集合,并使用set.intersection()或集合成员资格测试(取决于结果再次是一个集合是否可以接受)。在

完整代码可以如下所示:

l1 = set(l1)
d2 = {k: [s for s in v if s in l1] for k, v in d1.iteritems()}
d2 = {k: v for k, v in d2.iteritems() if v}

与两种字典理解不同,在这里使用单个for循环可能更好:

^{pr2}$

问题不在于dict理解,而是其中的嵌套列表理解。每次迭代相同的键。这种事最好用布景来做。在

s1 = set(l1)
d2 = {k: list(s1.intersection(v)) for k, v in d1.items()}

相关问题 更多 >