Python:使用多列表理解创建字典

2024-10-01 07:36:03 发布

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

有没有办法可以用list comprehension answered in this thread来创建字典?在

listA = [
    "apple_v001",
    "apple_v002",
    "banana_v001",
    "orange_v001",
]
keywords = ["apple", "banana", "orange"]
[[item for item in listA if kw in item] for kw in keywords]
# Result: [['apple_v001', 'apple_v002'], ['banana_v001'], ['orange_v001']] # 

我要做的是创建一个字典,使用关键字作为这个结果的键。所以

^{pr2}$

等等。我试图做dict={key,value for…(iteration)}但总是得到语法错误。我真的不知道该怎么开始,谢谢你帮忙。在


Tags: inapplefor字典itemlistbananakw
3条回答

如果你不想使用一层纸解决方案,请检查这个

In [58]: d
Out[58]: defaultdict(<type 'list'>, {})

In [59]: for elem in keywords:
   ....:     for item in listA:
   ....:         if item.startswith(elem):
   ....:             d[elem].append(item)
   ....:

In [60]: d
Out[60]: defaultdict(<type 'list'>, {'orange': ['orange_v001'], 'apple': ['apple_v001', 'apple_v002'], 'banana': ['banana_v001']})
{kw: [item for item in listA if kw in item] for kw in keywords}

但这似乎不是一个特别有效的方法来创造这样一个口头禅

例如,这不需要预先列出关键字,而且效率相当高

^{pr2}$

对于Python2.6,等效值为

dict((kw, [item for item in listA if kw in item]) for kw in keywords)

以及

>>> from itertools import groupby
>>> dict((k,list(g)) for k,g in groupby(sorted(listA), key=lambda x:x.partition('_')[0]))
{'orange': ['orange_v001'], 'apple': ['apple_v001', 'apple_v002'], 'banana': ['banana_v001']}

In the comments you mentioned that you use Python 2.6。Python2.6中没有dict理解,您可以将dict()与生成器表达式一起使用:

d = dict((kw, [item for item in listA if kw in item]) for kw in keywords)

这里有一个可能更有效的版本:

^{pr2}$

如果listA始终采用问题中给定的格式:

from collections import defaultdict

keywords = set(keywords)
d = defaultdict(list)
for item in listA:
    word = item.partition("_")[0]
    if word in keywords:
       d[word].append(item)

如果listA不包含keywords中不包含的项:

from collections import defaultdict

d = defaultdict(list)
for item in listA:
    d[item.partition('_')[0]].append(item)

相关问题 更多 >