1

このスレッドで回答されたリスト内包表記を使用して辞書を作成する方法はありますか?

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) } を実行しようとしましたが、常に構文エラーが発生します。どうやって始めたらいいのかわからないので、助けていただければ幸いです。

4

4 に答える 4

2
{kw: [item for item in listA if kw in item] for kw in keywords}

しかし、これはそのようなdictを作成するための特に効率的な方法ではないようです

たとえば、これは事前にキーワードのリストを必要とせず、適度に効率的です

>>> 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']}
于 2013-03-05T04:00:09.893 に答える
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']})
于 2013-03-05T04:01:48.743 に答える
1

コメントで、 Python 2.6 を使用していると述べました。dict()Python 2.6 には辞書内包表記はありません。代わりにジェネレータ式を使用できます。

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)
于 2013-03-05T04:34:08.960 に答える
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以降)辞書内包表記:

>>> {e:re.findall(r'{}_v\d+'.format(e),s) for e in keywords}
{'orange': ['orange_v001'], 'apple': ['apple_v001', 'apple_v002'], 'banana': ['banana_v001']}
于 2013-03-05T05:04:58.260 に答える