2013-03-06 130 views
0

重复我有这样一个代码:计数单词的列表中的PYTHON

s = "hello this is hello this is baby baby baby baby hello" 
slist = s.split() 
finallist = [] 
for word in slist: 
    if len(word) >= 4: 
      final = final + [word] 

基本上这以上代码,用于取列表,并仅把具有多于4个字符的单词列表。

从这个列表中,我希望能够统计同一单词出现的次数并将其保存到新列表中。所以它会像[3,2,4] 3是你的时代,2是这个时代,4是婴儿。

+1

我建议这样的:HTTP:// docs.python.org/2/library/collections.html#collections.Counter – squiguy 2013-03-06 03:13:27

+0

看起来像作业。 – Demosthenex 2013-03-06 03:18:24

+0

@squiguy谢谢你这是我正在寻找的文档。 – 2013-03-07 04:24:37

回答

3
from collections import Counter 
import re 

reg = re.compile('\S{4,}') 

s = "hello this is hello this is baby baby baby baby hello" 
c = Counter(ma.group() for ma in reg.finditer(s)) 
print c 

结果

Counter({'baby': 4, 'hello': 3, 'this': 2}) 

另外:

from collections import defaultdict 
d = defaultdict(int) 

s = "hello this is hello this is baby baby baby baby hello" 

for w in s.split(): 
    if len(w)>=4: 
     d[w] += 1 

print d 
+0

@Xaphen''re''是将正则表达式带给我们处理的模块。模式'''\ S {4,}'''表示'任何不同于空格的字符'''S'',这些字符的数量:4或更多。空格是''\ f'','''''''''''',''''''''''','''\ t'',''\ v'',''\ x''和空格。 ''re.finditer(s)''是在''s'中找到的匹配生成器,用于验证模式。一个匹配''ma''内部保存信息:''ma.group()''是由''s''匹配的整个匹配部分组成的信息 – eyquem 2013-03-06 03:22:43

+0

@Xaphen谢谢。请注意,我使用了''re.finditer()'',因为它是一个一个接一个地产生匹配的生成器,而不必象''re.findall()''一样在迭代之前创建一个新对象。但是,如果字符串不是巨大的,它可能等同于编写“Counter(reg.findall(text))”。如果这样的研究不再重复,那么regex对象''reg''不会再被使用,它也可以直接写''Counter(re.findall('\ S {4,}'),text ))'' – eyquem 2013-03-07 10:31:28

3

collections.Counter显然是你的朋友(除非你需要在一个特定的输出的排序顺序)。将它与生成器理解结合生成所有长度为4的单词,你是金。

from collections import Counter 

Counter(w for w in s.split() if len(w) >= 4) 

如果你需要的元素在他们的第一个出现的顺序,使用有序字典:

from collections import OrderedDict 

wc = OrderedDict() 
for w in s.split(): 
    if len(w) >= 4: 
     wc[w] = wc.get(w, 0) + 1 
+0

简单,直接,清晰。 – eyquem 2013-03-06 03:30:26

1

所有你需要做的就是使用count方法从SLIST。

我想你可以使用一个字典内有

s = "hello this is hello this is baby baby baby baby hello" 
slist = s.split() 
finaldict = {} 
for word in slist: 
    if len(word) >= 4 and not finaldict.get(word): 
      finaldict[word] = slist.count(word) 

更好的控制现在,如果你想要的值列表,只是这样做:finallist = finaldict.values()

+0

...这不是很快,因为你多次使用'.count'。 – nneonneo 2013-03-06 03:24:17

+0

@nneonneo每个字只使用一次计数。 – 2013-03-06 03:25:26

+0

@FernandoFreitasAlves:如果它是一个充满独特单词的列表,那么它真的很糟糕:) – nneonneo 2013-03-06 03:25:49