2014-01-29 2 views
0

Немного новичок здесь python/programming.Доступ к диапазону первого элемента кортежа в списке кортежей

Я пытаюсь получить доступ к указанному набору кортежей из списка кортежей, но я хочу получить доступ к первому элементу из набора кортежей. Указанный диапазон основан на шаблоне, который я ищу в строке текста, которая была маркирована и помечена nltk. Мой код:

from nltk.tokenize import word_tokenize 
from nltk.tag import pos_tag 

text = "It is pretty good as far as driveway size is concerned, otherwise I would skip it" 
tokenized = word_tokenize(text) 
tagged = pos_tag(tokenized) 

def find_phrase(): 
    counter = -1 
    for tag in tagged: 
     counter += 1 
     if tag[0] == "as" and tagged[counter+6][0] == "concerned": 
      print tagged[counter:counter+7] 

find_phrase() 

печатная продукция:

[('as', 'IN'), ('far', 'RB'), ('as', 'IN'), ('driveway', 'NN'), ('size', 'NN'), ('is', 'VBZ'), ('concerned', 'VBN')]

То, что я на самом деле хочу:

['as', 'far', 'as', 'driveway', 'size', 'is', 'concerned']

Можно ли изменить свою строку кода print tagged[counter:counter+7], чтобы получить мой желаемый печатный результат?

+1

FYI всякий раз, когда вы оказываетесь писать переменную-счетчик, который просто получает приращение в цикле, вы, вероятно, следует использовать ' вместо этого перечислите. – roippi

ответ

2

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

result, _ = zip(*find_phrase()) 
print result 
+0

, который отлично работает, но я понятия не имею, как это работает. Zip Я знаком с, но я никогда не вижу переменную, объявляемую с запятой и символом подчеркивания 'result, _'. Что там происходит, или вы можете указать мне на какую-то документацию? –

+1

@ Darren это просто допустимое имя переменной. По общему соглашению, именование переменной '_' означает« я не использую это ». Найдите «распаковку кортежа», если вы не понимаете, как две вещи назначаются слева. – roippi

+0

@roippi спасибо за это, теперь я понял. –

3

Возможно, самый простой способ использует list comprehension. Этот оператор создает список из первого элемента каждого кортежа в списке:

print [tup[0] for tup in tagged[counter:counter+7]] 

или просто для удовольствия, если кортежи всегда пары, вы могли бы придавить список (используя любой метод, который вы любите), а затем распечатать каждый второй элемент с шага обозначением slice нотации питона:

print list(sum(tagged[counter:counter+7],()))[::2] 

Или использовать map с функцией itemgetter, которая вызывает метод __getitem__() для получения 0-й индекса каждого кортежа в списке:

from operator import itemgetter 
print map(itemgetter(0), tagged[counter:counter+7]) 

Что-нибудь еще? Я уверен, что их больше.

0

Вы пробовали zip? также пункт [0] для пункта в названии

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