我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的结果中。打印结果。“
虽然计数看起来更容易
答案 0 :(得分:1)
假设您打算使用red
和filter
过滤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)
您是否故意使用filter
和lambda
?如果您想获得项目数,可以使用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