2014-04-17 3 views
0

중첩 목록을 사용하고 적절한 명사를 제거하는 새로운 목록을 반환하려고하는 중입니다.중첩 목록에서 고유 명사 제거하기 python

L = [['The', 'name', 'is', 'James'], ['Where', 'is', 'the', 'treasure'], ['Bond', 'cackled', 'insanely']] 

I 반환 할 : ''삭제됩니다

['the', 'name', 'is', 'is', 'the', 'tresure', 'cackled', 'insanely'] 

를 적어 둡니다을 여기

은 예입니다. 중첩 목록의 다른 곳에서는 나타나지 않기 때문에 괜찮습니다. 중첩 된 각 목록은 문장입니다. 내 접근 방식은 중첩 목록의 모든 첫 번째 요소를 newList에 추가하는 것입니다. 그런 다음 newList의 요소가 중첩 목록에 있는지 비교합니다. 나는 그 요소를 newList에 소문자로 검사 할 것이다. 나는이 프로그램을 반쯤 마쳤지만 끝에있는 newList에서 요소를 제거하려고 할 때 오류가 발생합니다. 새로운 업데이트 목록이 생기면 newList에있는 항목을 nestedList에서 삭제하려고합니다. 마지막으로 중첩 목록에있는 모든 항목을 newerList에 추가하고 소문자로 지정합니다. 그렇게해야합니다.

누군가가보다 효율적인 방법을 사용하면 기꺼이 들어 줄 것입니다. 이 코드는 두 번째의 오류로 인해 완료되지

def lowerCaseFirst(L): 
    newList = [] 
    for nestedList in L: 
     newList.append(nestedList[0]) 
    print newList 

    for firstWord in newList: 
     sum = 0 
     firstWord = firstWord.lower() 
     for nestedList in L: 
      for word in nestedList[1:]: 
       if firstWord == word: 
        print "yes" 

        sum = sum + 1 
      print newList 
     if sum >= 1: 
      firstWord = firstWord.upper() 
      newList.remove(firstWord) 
    return newList 

주 라인 여기

가 newerList (updatedNewList) 함께 지속한다 :

def lowerCaseFirst(L): 
    newList = [] 
    for nestedList in L: 
     newList.append(nestedList[0]) 
    print newList 
    updatedNewList = newList 
    for firstWord in newList: 
     sum = 0 
     firstWord = firstWord.lower() 
     for nestedList in L: 
      for word in nestedList[1:]: 
       if firstWord == word: 
        print "yes" 

        sum = sum + 1 
      print newList 
     if sum >= 1: 
      firstWord = firstWord.upper() 
      updatedNewList.remove(firstWord) 
    return updatedNewList 

오류 메시지 :

Traceback (most recent call last): 
    File "/Applications/WingIDE.app/Contents/MacOS/src/debug/tserver/_sandbox.py", line 1, in <module> 
    # Used internally for debug sandbox under external interpreter 
    File "/Applications/WingIDE.app/Contents/MacOS/src/debug/tserver/_sandbox.py", line 80, in lowerCaseFirst 
ValueError: list.remove(x): x not in list 
+2

오류가 실제로 무엇인지는 언급하지 않지만 반복하면서 목록을 변경할 수는 없습니다.이전 목록에서 가져 오지 않은 항목을 제거하지 않고 원하는 항목을 새 목록에 추가하는 것이 어떻습니까? 더 일반적인 피드백이 필요하면 http://codereview.stackexchange.com을 시도하십시오. – jonrsharpe

+0

첫 번째 "The"소문자입니까? – MxyL

답변

1

첫 번째 기능의 오류가 발생했습니다. 당신은 대문자 단어가없는 newlist에서 firstword의 대문자 버전을 제거하려고합니다 (인쇄물에서 보았을 때). 새로운 변수에 단어의 대문자/소문자 버전을 저장하지만 원래 목록의 내용은 변경하지 않는다는 것을 기억하십시오.

아직 귀하의 접근 방식을 이해하지 못합니다. 당신은 당신의 일을 묘사하면서 당신이 사물에하고 싶습니다. 1) 목록의 목록을 요소 목록으로 평평하게하고 (항상 재미있는 프로그래밍 연습) 2)이 목록에서 고유 명사를 제거합니다. 즉, 고유 명사가 무엇인지 결정해야합니다. 당신은 우연히 그렇게 할 수 있습니다 (시작되지 않은 모든 단어 또는 철저한 목록). POS 타거를 사용할 수도 있습니다 (Finding Proper Nouns using NLTK WordNet 참조). 내가 당신의 임무를 완전히 오해하지 않는 한, 당신은 여기서 케이싱에 대해 걱정할 필요가 없습니다.

첫 번째 작업은 여러 가지 방법으로 해결할 수 있습니다.

def flatten(L): 
    newList = [] 
    for sublist in L: 
     for elm in sublist: 
      newList.append(elm) 
    return newList 

이 기능은 flattenAndFilter로 만들 수 있습니다 (다음은 목록 (L)가 (무한 중첩 될 수 없습니다리스트) 목록의 목록입니다 실제로 간단한 경우에 happenes 것을 잘 보여주는 좋은 방법입니다 이 같은 각 요소를 확인하여 L) :

PN = [ '제임스', '본드'] 당신은 PN이 그러한 좋은 목록이 없을 수 있습니다

def flattenAndFilter(L): 
    newList = [] 
    for sublist in L: 
     for elm in sublist: 
      if not elm in PN: 
       newList.append(elm) 
    return newList 

을하지만, 당신은 확장 할 것 예를 들어 문장을 파싱하고 POS 태그를 확인하는 등의 점검을합니다.

관련 문제