2014-01-29 133 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]项名称

相关问题