试图过滤特定的单词

时间:2014-03-07 12:32:26

标签: python list filter

我2天前开始学习python,而且我被困了

我有50种随机颜色的列表

f = ['black', 'red', 'blue', 'red', 'black', 'red', 'white', 'white', 'orange', 'black', 'orange', 'black', 'red', 'green', 'yellow', 'blue', 'blue', 'purple', 'white', 'yellow', 'green', 'black', 'orange', 'white', 'black', 'blue', 'blue', 'blue', 'orange', 'yellow', 'yellow', 'blue', 'red', 'white', 'yellow', 'blue', 'red', 'yellow', 'yellow', 'white', 'white', 'black', 'purple', 'red', 'orange', 'orange', 'blue', 'orange', 'black', 'red']

我想检索列表中有多少种颜色,所以我尝试使用filter和len

当我尝试过滤时,

filter(lambda x:'red', f)

它返回完整列表,所以当我使用len()时,它给了我50。

我的滤镜在哪里出错了?我试过浏览文档,但似乎找不到任何东西,但会继续寻找。

任何提示?

我的作业规范指出,

“(优秀)使用颜色上的地图来计算(使用过滤器,减少或减去)的频率 每种颜色都出现在子任务3的结果中。打印结果。“

虽然计数看起来更容易

6 个答案:

答案 0 :(得分:1)

假设您打算使用redfilter过滤lambda的所有值:

>>> filter(lambda x: x != 'red', f)
['black', 'blue', 'black', 'white', 'white', 'orange', 'black', 'orange', 'black
', 'green', 'yellow', 'blue', 'blue', 'purple', 'white', 'yellow', 'green', 'bla
ck', 'orange', 'white', 'black', 'blue', 'blue', 'blue', 'orange', 'yellow', 'ye
llow', 'blue', 'white', 'yellow', 'blue', 'yellow', 'yellow', 'white', 'white',
'black', 'purple', 'orange', 'orange', 'blue', 'orange', 'black']

使用列表理解:

>>> [x for x in f if x != 'red']

或生成器表达式与list()

一起
>>> list(x for x in f if x != 'red')

您遇到的问题

filter(lambda x:'red', f)

您不是要将f的元素与'red'进行比较。本质上,该函数返回一个包含f中所有元素的新列表。上述任何方法都将过滤列表中的所有'red'值。

如果您想使用此方法获取'red'元素的数量(而不是list.count,那么:

>>> len(filter(lambda x: x == 'red', f))
8

答案 1 :(得分:1)

你的lambda函数实际上并没有进行任何比较:它只是每次返回字符串'red',它总是为True,所以没有任何项目被过滤掉。你需要实际比较字符串和传递给lambda的字符串,即x

filter(lambda x: x == 'red', f)

答案 2 :(得分:1)

  

我想检索列表中有多少种颜色,

您不必过滤,创建新列表,然后找到它的长度。只需使用list.count功能,就像这样

print f.count('red')

答案 3 :(得分:1)

您是否故意使用filterlambda?如果您想获得项目数,可以使用count类型的list方法:

>>> f = ['black', 'red', 'blue', 'red', 'black', 'red', 'white', 'white', 'orange', 'black', 'orange', 'black', 'red', 'green', 'yellow', 'blue', 'blue', 'purple', 'white', 'yellow', 'green', 'black', 'orange', 'white', 'black', 'blue', 'blue', 'blue', 'orange', 'yellow', 'yellow', 'blue', 'red', 'white', 'yellow', 'blue', 'red', 'yellow', 'yellow', 'white', 'white', 'black', 'purple', 'red', 'orange', 'orange', 'blue', 'orange', 'black', 'red']
>>> f.count("red")
8

答案 4 :(得分:1)

字典对你的情况来说是最好的imho:)

f = ['black','blue','black','white','white','orange','black','orange','black','green','yellow', 'blue','blue','purple','white','yellow','green','black','orange','white','black','blue','blue','blue ','orange','yellow','yellow','blue','white','yellow','blue','yellow','yellow','white','white','black', 'purple','orange','orange','blue','orange','black']

dictionary = {}
for i in f:
    if i in dictionary:
        dictionary[i] += 1
    else:
        dictionary[i]  = 0

答案 5 :(得分:1)

count适用于一种颜色,但如果您想多次查询:

>>> from collections import defaultdict

>>> def get_as_count_dict(ls):
       res = defaultdict(int)
       for word in ls:
           res[word] += 1
       return res


>>> r = get_as_count_dict(['red', 'red', 'blue', 'pink'])
>>> r['red']
2

>>> r['nope']
0

或者我们可以直接使用Counter

>>> from collections import Counter

>>> r = Counter(['red', 'red', 'blue', 'pink'])
>>> r['red']
2

>>> r['nope']
0