统计符合特定条件的列表元素数量

3

我有一个列表,比如说:

   list = ['KAYE', 'DAVID', 'MUSIC', '88', 'ART', '45', 'FRENCH', '36']

我想要统计列表中小于50的标记数量,因此我写了以下代码:

count = 0
if  list[3] < '50' or list[5] < '50' or list[7] < '50':
    count = count + 1

但是计数总是1,当有多个低于50分的标记时,它不会累积。

我该怎么解决这个问题?非常感谢您的帮助。


这些索引(5、7、9)代表什么? - styvane
2
不要使用字符串来比较数字,使用sum来获取计数。 - Padraic Cunningham
请勿使用内置函数作为变量名。 - styvane
索引(5、7、9)来自原始数组,它们应该是(3、5、7)。对此很抱歉。 - Kevin Liu
5个回答

0

您只运行了一次代码,所以最大计数当然是1


如果你想测试一个列表中的每个元素,并查看有多少个数字小于50,你可以这样做:
count = 0
list = ['strings','morestrings','12','4334','anotherstring']
for val in list:
    try:
        val = int(val)
        if val < 50:
            count += 1
    except ValueError:
        continue

print(count)

我已经修复了我发布的代码,对于造成的困扰我感到抱歉。 - Kevin Liu

0

您正在使用一个if语句来检查多个条件。如果其中一个成功,它将运行下一行(仅一次),该行会增加count的值。尝试使用以下更好的方式:

my_list = ['KAYE', 'DAVID', 'MUSIC', '88', 'ART', '45', 'FRENCH', '36']
count = 0
for i in [3,5,7]:
    if int(my_list[i]) < 50:
        count += 1

其中count为2(45和36都小于50)。这将遍历您指定的索引([3,5,7])。for循环在每个索引上运行检查,如果评估为True,则增加count

此外,我已将您的list重命名为my_list(由@user3100115建议),因为list是列表的内置符号。

我觉得你已经知道要检查的索引很奇怪。如果您已经知道,那么这很好。但是如果您不知道呢?您可以通过以下方式检查整个my_list中是否有任何小于50的数字:

my_list = ['KAYE', 'DAVID', 'MUSIC', '88', 'ART', '45', 'FRENCH', '36']
count = 0
for i in my_list:
    try:
        if int(i) < 50:
            count += 1
    except:
        pass

tryexcept 的作用是因为将 i 解释为 int 类型时,如果它实际上不是一个数字,可能会引发错误。而 except: pass 则会忽略这个错误。


0
这是一种实现方式:
count = len([x for x in (list[3], list[5], list[7]) if (int(x) < 50)])

而且,正如这里所示,您需要在比较之前将其转换为int,否则,例如,“100”将被认为小于“50”。


0

你正在运行一个测试,它检查多个可能的条件,并且在其中任何一个为真时执行一段代码。

我认为你想要计算有多少个分数小于50,并报告总数。

让我们先做一个简单版本,然后再逐步扩展:

student = ['KAYE', 'DAVID', 'MUSIC', '88', 'ART', '45', 'FRENCH', '36']
ALARM = 50

num_alarms = 0

if int(student[3]) < ALARM:
    num_alarms += 1
    print("Alarm! The " + student[2] + " grade is too low!")

if int(student[5]) < ALARM:
    num_alarms += 1
    print("Alarm! The " + student[4] + " grade is too low!")

if int(student[7]) < ALARM:
    num_alarms += 1
    print("Alarm! The " + student[6] + " grade is too low!")

if num_alarms != 0:
    print("There were " + str(num_alarms) + " grades too low.")

这做了我认为你试图做的事情。但我们可以稍微整理一下:

student = ['KAYE', 'DAVID', 'MUSIC', '88', 'ART', '45', 'FRENCH', '36']
ALARM = 50

num_alarms = 0

# count from 3 .. by 2
for score in range(3,len(student), 2):
    if int(student[score]) < ALARM:
        print("Alarm! The " + student[score-1] + " grade is too low!")
        num_alarms += 1

if num_alarms != 0:
    print("There were " + str(num_alarms) + " grades too low.")

最后,我们可以"完全使用Python"并添加列表推导式:
alarms = [ student[class_] for class_ in range(2, len(student), 2) if int(student[class_ + 1]) < ALARM ]

for class_ in alarms:
    print("Alarm! The " + class_ + " grade is too low!")

num_alarms = len(alarms)

if num_alarms != 0:
    print("There were " + str(num_alarms) + " grades too low.")

0

只是另一种简短的方式...

>>> marks = ['KAYE', 'DAVID', 'MUSIC', '88', 'ART', '45', 'FRENCH', '36']

>>> sum(int(x) < 50 for x in marks[3::2])
2

这也适用于David有三个以上或少于三个标记的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接