查找列表中每个元素中某个字符的数量

Finding how many of a certain character in each element in a list

我想找出每个句子中有多少个 ' '(空格)恰好是列表中的元素。因此对于: ['this is a sentence', 'this is one more sentence'] 调用元素 0 将 return 值为 3,而调用元素 1 将 return 值为 4。我真的很难找到空格以及循环遍历每个元素以找到空格数最多的一个。

使用 count

进行简单的列表理解
>>> lst = ['this is a sentence', 'this is one more sentence']
>>> [i.count(' ') for i in lst]
[3, 4]

其他方法包括使用 map

>>> map(lambda x:x.count(' '),lst)
[3, 4]

如果你想要一个可调用函数(正如你提到的那样,它是一个遍历你的列表的函数),它可以实现为

>>> def countspace(x):
...     return x.count(' ')
... 

并执行为

>>> for i in lst:
...     print countspace(i)
... 
3
4

这可以使用 re module as mentioned below by

使用正则表达式来解决
>>> import re
>>> [len(re.findall(r"\s", i)) for i in lst]
[3, 4]

Post编辑

正如你所说的你也需要找到最大元素,你可以做到

>>> vals = [i.count(' ') for i in lst] 
>>> lst[vals.index(max(vals))]
'this is one more sentence'

可以使用

将其实现为可调用对象
>>> def getmax(lst):
...     vals = [i.count(' ') for i in lst]
...     maxel = lst[vals.index(max(vals))]
...     return (vals,maxel)

并将其用作

>>> getmax(lst)
([3, 4], 'this is one more sentence')

Post评论编辑

>>> s = 'this is a sentence. this is one more sentence'
>>> lst = s.split('. ')
>>> [i.count(' ') for i in lst]
[3, 4]

您声明 "whitespace",通常会包括这些字符 '\t\n\x0b\x0c\r ',以及任何 Unicode 字符,例如u'\u3000'(象形文字 SPACE)。

正则表达式解决方案是更好的解决方案之一,因为除了通常的 ascii 代码点之外,它还可以轻松支持任何 unicode 空白代码点。只需使用 re.findall() and set the re.UNICODE 标志:

import re

def count_whitespace(s):
    return len(re.findall(r'\s', s, re.UNICODE))

l = ['this is a sentence',
     'this is one more sentence',
     '',
     u'\u3000\u2029    abcd\t\tefghi[=10=]xb  \n\r\nj k  l\tm    \n\n',
     'nowhitespaceinthisstring']

for s in l:
    print count_whitespace(s)

输出

3
4
0
23
0

一种简单的、非正则表达式的方法是使用 str.split(),它自然地拆分任何空白字符,是从字符串中删除所有空白的有效方法。这也适用于 unicode 空白字符:

def count_whitespace(s):
    return len(s) - len(''.join(s.split()))

for s in l:
    print count_whitespace(s)

输出

3
4
0
23
0

最后,挑出空格字符最多的句子:

>>> max((count_whitespace(s), s) for s in l)[1]
u'\u3000\u2029    abcd\t\tefghi\x00xb  \n\r\nj k  l\tm    \n\n'

可以用Counter。不知道比.count()

耗时多少
from collections import Counter
lst = ['this is a sentence', 'this is one more sentence']
>>>[Counter(i)[' '] for i in lst]
[3, 4]