我想根据下面的IF语句打印项目数。我下面的内容是打印整个列表,7次,每个项目的计数(1)。那不是我想要的。理想情况下它会返回:
5
1
1
有什么想法吗?
from collections import Counter
li = (1,4,55,6,87,44,25)
for i in li:
if i < 50:
print(Counter(li))
elif i > 50 and i < 85:
print(Counter(li))
else:
print(Counter(li))
答案 0 :(得分:3)
你需要正常化&#39;你的价值观和数量;因此,对于i < 50
案例,您可以使用字符串'below 50'
并计算这些值:
counts = Counter(
'below 50' if i < 50 else '50 - 84' if i < 85 else '85 or up' for i in li
)
print(counts['below 50'])
print(counts['50 - 84'])
print(counts['85 or up'])
请注意,我计算了50
组中的50 - 84
。这会生成一个计数器对象,然后您只需要询问特定的标签:
>>> counts = Counter(
... 'below 50' if i < 50 else '50 - 84' if i < 85 else '85 or up' for i in li
... )
>>> counts
Counter({'below 50': 5, '85 or up': 1, '50 - 84': 1})
但是,你真的不需要Counter()
。对于这种情况,只使用3个变量会更容易:
below50 = 0
between50_84 = 0
over84 = 0
for i in li:
if i < 50:
below50 += 1
elif i < 85:
between50_84 += 1
else:
over84 += 1
print(below50)
print(between50_84)
print(over84)
答案 1 :(得分:1)
您也可以在此处使用pandas.cut
和pandas.Series.value_counts
。 .cut
:
返回x的每个值所属的半开仓的索引。
li = (1,4,55,6,87,44,25)
counts = pd.cut(li, bins=[-float('inf'), 50., 85., float('inf')],
labels=['<50', '50-85', '>85']).value_counts()
您的结果将是熊猫系列。
print(counts)
<50 5
50-85 1
>85 1
请注意参数right
指示容器是否包含最右边。如果正确 == True(默认值),然后bin [1,2,3,4]表示(1,2],(2,3),(3,4)。
最后,如果您不指定标签,则默认为:
counts = pd.cut(li, bins=[-float('inf'), 50., 85., float('inf')]).value_counts()
print(counts)
(-inf, 50.0] 5
(50.0, 85.0] 1
(85.0, inf] 1