-2

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

2 回答 2

3

您需要“规范化”您的价值观并计算它们;因此,对于这种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'])

请注意,我算5050 - 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)
于 2017-09-14T17:24:53.717 回答
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

指示 bin 是否包括最右边的边缘。如果 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
于 2017-09-14T17:32:23.937 回答