2013-02-18 149 views
1

我是Python新手,對列表和元組有一些疑問。 我有一個由句子和wordclass-tags組成的列表。這是我列表中的一個元素:Python中的元組列表

[('It', 'PPS'), ('says', 'VBZ'), ('that', 'CS'), ('``', '``'), ('in', 'IN'), ('the', 'AT'), ('event', 'NN'), ('Congress', 'NP'), ('does', 'DOZ'), ('provide', 'VB'), ('this', 'DT'), ('increase', 'NN'), ('in', 'IN'), ('federal', 'JJ'), ('funds', 'NNS'), ("''", "''"), (',', ','), ('the', 'AT'), ('State', 'NN-TL'), ('Board', 'NN-TL'), ('of', 'IN-TL'), ('Education', 'NN-TL'), ('should', 'MD'), ('be', 'BE'), ('directed', 'VBN'), ('to', 'TO'), ('``', '``'), ('give', 'VB'), ('priority', 'NN'), ("''", "''"), ('to', 'IN'), ('teacher', 'NN'), ('pay', 'NN'), ('raises', 'NNS'), ('.', '.')] 

正如您所看到的,每個單詞都有一個wordclass-tag。如何在我的列表中搜索word + wordclass之後? F.ex.如果我想看看這個元素是否包含附加到wordclass-tag「JJ」的單詞「federal」?

非常感謝幫助

+0

我很難搞清楚你真的在這裏嘗試了什麼 - 但它看起來像一個不同的數據結構會讓你的生活變得更容易。也許是一個擁有清單的詞典?那麼你可以將單詞映射到單詞列表中? – mgilson 2013-02-18 18:56:56

回答

1

要檢查是否有「聯邦」標籤與名單上的「JJ」字:

your_list = [('It', 'PPS'), ('says', 'VBZ'), ('that', 'CS'), ('``', '``'), ('in', 'IN'), ('the', 'AT'), ('event', 'NN'), ('Congress', 'NP'), ('does', 'DOZ'), ('provide', 'VB'), ('this', 'DT'), ('increase', 'NN'), ('in', 'IN'), ('federal', 'JJ'), ('funds', 'NNS'), ("''", "''"), (',', ','), ('the', 'AT'), ('State', 'NN-TL'), ('Board', 'NN-TL'), ('of', 'IN-TL'), ('Education', 'NN-TL'), ('should', 'MD'), ('be', 'BE'), ('directed', 'VBN'), ('to', 'TO'), ('``', '``'), ('give', 'VB'), ('priority', 'NN'), ("''", "''"), ('to', 'IN'), ('teacher', 'NN'), ('pay', 'NN'), ('raises', 'NNS'), ('.', '.')] 
print ('federal', 'JJ') in your_list 

使用列表中理解語法,你可以做更多與您的清單有趣的事情,例如看到一個單詞的所有出現的所有標籤:

print " ".join([wordclass for word, wordclass in your_list if word == 'federal']) 

這是很好的建立了一些功能上的數據做通用操作結構和你一起工作,如檢查它是否包含一個詞或標籤:

def hasWord(l, word): 
    for w, wordclass in l: 
     if w == word: 
      return True 
    return False 

def hasTag(l, tag): 
    for w, wordclass in l: 
     if wordclass == tag: 
      return True 
    return False 

if hasTag(your_list, 'JJ'): print your_list 

要回答你的問題的意見:

for sentence in sentences: 
    if ('federal', 'JJ') in sentence: 
     print sentence 
+0

這幾乎可以做到這一點。但是,我怎麼能用它來找到女巫匹配一個特定單詞的全部元素? 如果包含特定單詞wordclass,我想打印整個句子? – Jectson 2013-02-18 18:53:03

+0

查看更新的答案。這是你要求的嗎? – piokuc 2013-02-18 19:05:51

+0

幾乎我認爲,但它必須是一個組合。我必須通過列表中的每個元素(句子)搜索單詞和單詞類別的組合,然後打印整個元素(句子)(如果匹配)。 – Jectson 2013-02-18 19:09:47

2

我會使用一組來代替。然後你就可以有效地使用in操作:

wlist = set([('It', 'PPS'), ('says', 'VBZ'), ('that', 'CS'), ('``', '``'), ('in', 'IN'), ('the', 'AT'), ('event', 'NN'), ('Congress', 'NP'), ('does', 'DOZ'), ('provide', 'VB'), ('this', 'DT'), ('increase', 'NN'), ('in', 'IN'), ('federal', 'JJ'), ('funds', 'NNS'), ("''", "''"), (',', ','), ('the', 'AT'), ('State', 'NN-TL'), ('Board', 'NN-TL'), ('of', 'IN-TL'), ('Education', 'NN-TL'), ('should', 'MD'), ('be', 'BE'), ('directed', 'VBN'), ('to', 'TO'), ('``', '``'), ('give', 'VB'), ('priority', 'NN'), ("''", "''"), ('to', 'IN'), ('teacher', 'NN'), ('pay', 'NN'), ('raises', 'NNS'), ('.', '.')]) 

print ('federal', 'JJ') in wlist # prints True 
+0

爲什麼你不能在列表中使用'in'? – 2013-02-18 18:41:35

+0

林不知道該怎麼做..我已經用句子輸入了布朗語料庫,所以我在上面發佈了很多元素的列表。我試圖做這樣的事情: ' for brown_sents: counter = 0 如果有的話(s中的「house」): 如果有的話(「IN-TL」in r在套): 如果(出納員<1): 返回設定 計數器+ = 1 ' 的問題是,第一‘爲’找到正確的句子,但第二個通過整個句子的wordclass-搜索標記,而不僅僅是單詞.. – Jectson 2013-02-18 18:42:44

+0

@MarkusMeskanen:你可以,但它慢得多('O(n)'),因爲列表必須遍歷所有項目,而該集合執行哈希查找('O(1) )')。 – 2013-02-18 18:47:55

0

我的第一種方法是:

def find_tuple(input, l): 
    for (e1, e2) in l: 
     if e1==input[0] and e2==input[1]: 
      return True 
    return False 

它是直截了當的但靜態的,只適合你的問題。 一個更普遍而平等的做法:

def my_any(iterable, input, func): 
    for element in iterable: 
     if func(element, input): 
      return True 
    return False 

input = ("federal","JJ") 
l = [("It", "PPS"),("federal","JJ")] 
print(my_any(l, input, lambda x, y: x[0]==y[0] and x[1]==y[1])) 

傳遞一個lambda函數自己決定匹配你喜歡什麼布爾值。 而一個簡單的方法來,這將是這樣的:

input = ("federal","JJ") 
l = [("It", "PPS"),("federal","JJ")] 
if input in l: 
    print("True") 

如果你能對你喜歡解決它會更容易給予具體建議的問題更爲具體。 (即:什麼是你的返回類型:布爾/字符串/元組..?)希望這會有所幫助。

乾杯!