2011-12-17 2 views
0

단어와 숫자를 인쇄하려고합니다. 그런 :목록 생성기를 사용하여 단어 쌍과 발생 횟수를 비교하는 방법은 무엇입니까?

a aba aaa 
dd ddd dd 

내 밖으로 놈이야 포함 :

[[a,1],[dd,2],[aba ,1],[ddd,1],[aaa,1]] 

하지만은 다음과 같습니다

: 여기
[[a,1],[dd,2],[aba ,1],[dd,2],[ddd,1],[aaa,1]] 

전체 코드 1.TXT에서

import re 

def get_words_from_string(s): 
    return (re.findall(re.compile('\w+'), s.lower())) 


def merge(seq): 
    merged = [] 
    for s in seq: 
     for x in s: 
      merged.append(x) 
    return merged 


fp1 = open('1.txt' , 'r'); 

set1 = set(line.strip() for line in fp1); 

l1 =[] 
for x in set1: 
    x.split() 
    x = get_words_from_string(x) 
    l1.append(x) 

l1= merge(l1); 

out = [] 
out = [[word , l1.count(word)] for word in l1 if (1 > out.count(word))] 

단어가 첫 번째 항목에없는 경우 문제가 발생합니다. 목록에 항목이 포함되어 있는지 확인하는 안전한 방법이 있습니까?

+1

왜 작동하지 않는지 생각해보고 나서 결과를 포함하도록 질문을 수정하십시오. –

+1

이 코드를 실행하면 어떻게됩니까? – Blender

답변

1

그리고는 수입이없는 솔루션이 될 수있다 :

>>> f = open('1.txt', 'r') 
>>> words = f.read().split() 
>>> word_counter = {} 
>>> for word in words: 
... word_counter[word] = word_counter.get(word, 0) + 1 
... 
>>> word_counter 
{'a': 1, 'aba': 1, 'dd': 2, 'aaa': 1, 'ddd': 1} 

word_counter 이제 모든 단어의 frequences와 dict입니다. 목록 목록으로 사용하려면 목록 내역을 사용할 수 있습니다.

>>> word_counter_as_list = [ [k, v] for k, v in word_counter.items() ] 
>>> word_counter_as_list 
[['a', 1], ['aba', 1], ['dd', 2], ['aaa', 1], ['ddd', 1]] 
1

out = [[word , l1.count(word)] for word in l1 if (not(-1<l1.index(word)))] 

이 "/ 단어의 목록을 작성 -1 단어의 인덱스 미만 l1에 있지 않도록 각 단어에 대한 목록을 계산합니다"라고이 줄. 그러나 -1은 색인이 항상 양수이기 때문에 l1에있는 단어의 색인보다 항상 작습니다. 이렇게하면 모든 결과가 필터링됩니다.

not을 제거하면 예상대로 작동합니다. 그러나 필터는 완전히 무의미합니다. index의 결과는 항상 -1보다 커서 필터링 할 내용이 없습니다. 즉, wordl1에 없으면 예외가 throw됩니다.

코드를 더 보면 너는 지나치게 복잡한 프로그램을 만들게된다. 당신이 원하는 것을하는 3 가지 프로그램이 있습니다. 왜 라인의 set을 만든 다음 그 위에 반복합니까? 왜 당신은 정규식을 사용하고 있습니까? 이것은 내가 당신에게 최선의 방법을 보여 주기만하면 잘못 생각하는 간단한 문제입니다. 하지만, 여기에 몇 가지 힌트는 다음과 같습니다

>>> fp1 = open('1.txt' , 'r'); 
>>> s = fp1.read() 
>>> s 
'a aba aaa\ndd ddd dd\n' 
>>> s.split() 
['a', 'aba', 'aaa', 'dd', 'ddd', 'dd'] 
>>> set(s.split()) 
set(['a', 'aba', 'dd', 'aaa', 'ddd']) 
+0

예 질문의 잘못된 버전을 업로드했습니다. 이제 문제가 해결되었습니다. 물론 out.index 여야합니다. 그 점에 대해 미안하다, 나는 wifi와 함께 여기의 문제를 가지고있다. 감사합니다 – 0x90

+0

@ ZoZo123, 당신이 게시 한 새로운 코드가 전혀 작동하지 않습니다. list comprehension이 실행되는 동안'out'은 빈리스트이고,'index'는 예외를 던집니다. – senderle

+0

이렇게하면 목록 이해의 모든 반복에 대해 전체 목록을 반복합니다. –

2
from collections import Counter 

with open("1.txt") as f: 
    words = f.read().split() 

c = Counter(words) 

print [[word,count] for word, count in c.iteritems()] 
0
fp1 = open('1.txt' , 'r'); 
l1 = fp1.read(); 
    set1 = set(l1.split()); 
    for it in set1 : 
     print it, "count = " , l1.count(it); 
관련 문제