2014-01-29 131 views
0

這裏有點蟒蛇/編程新手。訪問元組列表中的元組的第一個元素的範圍

我想從元組列表中訪問指定範圍的元組,但我只想訪問元組範圍中的第一個元素。指定的範圍基於我正在尋找的模式字符串中已被標記並由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,但我從來沒有注意到一個變量被聲明爲尾部逗號和下劃線結果'_'。那裏發生了什麼,或者你可以指點我一些關於它的文檔? –

+1

@達倫它只是一個有效的變量名稱。按照慣例,命名一個變量'_'意味着'我不使用這個'。如果你不明白在左側如何分配兩件東西,請查找「解開元組」。 – roippi

+0

@roippi謝謝你,現在我明白了。 –

3

也許最簡單的方法使用list comprehension。這條語句創建從每一個元組的列表中的第一個元素的列表:

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

或者只是爲了好玩,如果元組始終對,你可以扁平化的列表(使用任何你喜歡的方法),然後打印

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

或者使用mapitemgetter功能,調用__getitem__()方法來檢索列表中的所有元組的第0指數:與符號Python的slice符號的每第二個元素

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

還有什麼?我相信還有更多。

0

你試過zip嗎? 也 項目[0]項名稱

相關問題