根据条件打印元组中元素的计数

时间:2017-09-14 17:18:07

标签: python tuples python-collections

我想根据下面的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))

2 个答案:

答案 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.cutpandas.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