有没有办法可以用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']] #
我要做的是创建一个字典,使用关键字作为此结果的关键字。所以
dictA["apple"] = ['apple_v001', 'apple_v002']
等等。我试图做dict = {key,value for ...(iteration)}但总是得到语法错误。我真的不知道如何开始,任何帮助欣赏。
答案 0 :(得分:2)
{kw: [item for item in listA if kw in item] for kw in keywords}
但这似乎不是创建这样一个字典的特别有效的方式
例如,这不需要事先提供关键字列表,而且效率相当高
>>> from itertools import groupby
>>> {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']}
对于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']}
答案 1 :(得分:2)
如果您不想使用一个班轮解决方案,请查看
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']})
答案 2 :(得分:1)
In the comments you mentioned that you use Python 2.6。在Python 2.6中没有字典理解,你可以使用dict()
代替生成器表达式:
d = dict((kw, [item for item in listA if kw in item]) for kw in keywords)
这是一个可能更有效的版本:
import re
from collections import defaultdict
search_word = re.compile("(%s)" % "|".join(map(re.escape, keywords))).search
d = defaultdict(list)
for item in listA:
m = search_word(item)
if m:
d[m.group(1)].append(item)
如果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)
答案 3 :(得分:0)
您可以使用正则表达式:
>>> import re
>>> listA = [
... "apple_v001",
... "apple_v002",
... "banana_v001",
... "orange_v001",
... ]
>>> keywords = ["apple", "banana", "orange"]
>>> s=' '.join(listA)
>>> dict([(e,re.findall(r'{}_v\d+'.format(e),s)) for e in keywords])
{'orange': ['orange_v001'], 'apple': ['apple_v001', 'apple_v002'], 'banana': ['banana_v001']}
或(发布Python 2.7)dict理解:
>>> {e:re.findall(r'{}_v\d+'.format(e),s) for e in keywords}
{'orange': ['orange_v001'], 'apple': ['apple_v001', 'apple_v002'], 'banana': ['banana_v001']}