2013-03-05 2 views
1

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)}을 시도했지만 항상 구문 오류가 발생합니다. 나는 정말로 어떻게 시작 해야할지 모르겠다.

+2

을 왜 태그'파이썬 2.7' 당신이 사용하는 경우 '파이썬 -2.6'? – jfs

답변

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) 

0 하나 개 라이너 솔루션을 가고 싶어하지 않는 경우
>>> 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']} 
+0

매우 흥미 롭습니다. 보여 줘서 고마워. 이것은 파이썬 3을위한 것입니까? Python 2.6을 사용하는 구문 오류가 발생했습니다. – Panupat

+0

@Panupat, 2.7+. 대답에 대한 대답을 추가 할 것입니다 –

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']}) 
+0

이 코드는 위의 한 줄보다 훨씬 읽기 쉽습니다! – JesseBikman

1

In the comments you mentioned that you use Python 2.6을 확인합니다.

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 경우가에 주어진 형식으로 항상 :

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

여기 가능성이 더 효율적인 버전입니다 : 파이썬 2.6에는 DICT 이해는 대신 발전기 expresion와 dict()을 사용할 수 없다 질문 :

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) 
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']} 

을 또는 (포스트 파이썬 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']}