2015-07-23 5 views
1

У меня есть файл из Moby Project, который сочетает слова с одной или несколькими буквами, указывающими их часть речи. Например:Python dict из файла mobypos.txt

hemoglobin\N 
hemogram\N 
hemoid\A 
hemolysin\N 
hemolysis\N 
hemolytic\A 
hemophile\NA 
hemophiliac\N 

Гемоглобин является существительное, гематоидный прилагательное и hemophile может быть использован как существительное или прилагательное.

Я создал Dict из этого файла, что пары слова с буквой, обозначающей частями речи, используя следующий код:

mm = open("mobypos.txt").readlines() 
pairs = [] 
for x in mm: 
    pairs.append(x.split("\\")) 
posdict = dict(pairs) 

Это работает успешно. Я хочу создать списки, называемые nouns, verbs, adjectives и т. Д., Которые содержат все слова этой части речи. Какой самый быстрый способ сделать это, учитывая, что len(posdict.keys()) возвращает 233340

ответ

1

Вы можете использовать список понимание

nouns = [word, type in posdict.iteritems() if 'N' in type] 

adjs = [word, type in posdict.iteritems() if 'A' in type] 

verbs = [word, type in posdict.iteritems() if 'V' in type] 

Использование оператора in в предложении if разместит слова с несколькими типами соответственно.

+0

Почему я хочу использовать 'iteritems' вместо' items'? Это быстрее? –

1

Вы можете использовать выражение генератора, чтобы получить итератор относительных слов:

nouns = (w for w,type in posdict.iteritems() if type=='N') 

Но обратите внимание, что поскольку итераторы один выстрел итерируемыми, когда вы просто хотите перебирать их и не хотите получать конкретные элементы или использовать некоторые функции, такие как len, их лучше использовать, которые очень оптимизированы с точки зрения использования памяти. но если вы хотите использовать их много раз, вам лучше использовать понимание списка.

nouns = [w for w,type in posdict.iteritems() if type=='N'] 
+0

Почему я хочу использовать 'iteritems' вместо' items'? Это быстрее? –

Смежные вопросы