Python 将列表中的元素排序为3个单独的列表

Python 将列表中的元素排序为3个单独的列表,python,python-3.x,loops,for-loop,Python,Python 3.x,Loops,For Loop,让我从代码开始,解释目标和我得到了什么 temp1 = ['3.8', 'Weiss, Earl', '139 RATINGS', '2.3', 'Jeppson, Catherine', '114 RATINGS', '3.3', 'Kiani-Aslani, Rajabali', '88 RATINGS', '2.6', 'Lundblad, Heidemarie', '82 RATINGS', '2.4', 'Stone, Ronald', '75 RATINGS', '3.7', 'Ve

让我从代码开始,解释目标和我得到了什么

temp1 = ['3.8', 'Weiss, Earl', '139 RATINGS', '2.3', 'Jeppson, Catherine', '114 RATINGS', '3.3', 'Kiani-Aslani, Rajabali', '88 RATINGS', '2.6', 'Lundblad, Heidemarie', '82 RATINGS', '2.4', 'Stone, Ronald', '75 RATINGS', '3.7', 'Vedd, Rishma', '66 RATINGS', '3.3', 'Foster, Robert', '60 RATINGS', '4.9', 'Basmadzhyan, Babken', '59 RATINGS', '4.3', 'Grodsky, Marilyn', '57 RATINGS', '2.4', 'Dorsey, Norris', '53 RATINGS', '2.6', 'Zvinakis, Kristina', '51 RATINGS', '3.2', 'MacKlin, James', '50 RATINGS', '2.8', 'Liu, David', '48 RATINGS', '3.2', 'Doron, Michael', '48 RATINGS', '2.1', 'Rogoff, Donald', '45 RATINGS', '3.1', 'Sangeladji, Mohammad', '43 RATINGS', '4.0', 'Fountaine, Howard', '42 RATINGS', '4.6', 'Stout, Gary', '41 RATINGS', '3.4', 'Gray, Glen', '34 RATINGS', '3.0', 'Wilson, Barbara', '31 RATINGS', '4.0', 'Yoon, Sung-Wook', '31 RATINGS', '4.5', 'Her, Young-Won', '31 RATINGS', '3.0', 'Kiddoo, Robert', '30 RATINGS', '3.0', 'Chiu, J', '27 RATINGS', '3.3', 'Barker, Robert', '25 RATINGS', '3.7', 'Qureshi, Mahmood', '23 RATINGS', '3.7', 'Primes, David', '22 RATINGS', '2.6', 'Chen, Raymond', '20 RATINGS', '3.3', 'Jones, Christopher', '20 RATINGS', '3.2', 'Zhan, Jun', '20 RATINGS', '4.6', 'Bell, Janice', '15 RATINGS', '3.8', 'Alhashim, Dhia D', '12 RATINGS', '2.9', 'Ansari, Shahid', '11 RATINGS', '4.5', 'Rousselet, Robin (rob)', '9 RATINGS', '2.4', 'Lucero, Terrence', '8 RATINGS', '1.0', 'Perez, Marlene', '7 RATINGS', '1.3', 'Crespo, Patricia', '7 RATINGS', '4.8', 'Knight, Ridgeway', '7 RATINGS', '2.5', 'Julius, Ed', '6 RATINGS', '2.9', 'Reinstein, Todd', '6 RATINGS']
我的目标是把这个巨大的列表分成3个不同的分类列表

教授姓名、教授评级和评级金额

我已经用下面的if语句开发了下面的for循环,尽管尝试使用它,但至少有一个不起作用,让我在下面的代码中向您展示

counter = 1
for index in temp1:
    if counter % 1 == 0:
        pro_rating.append(index)
    if counter % 2 == 0:
        pro_name.append(index)
    if counter % 3 == 0:
        pro_amount_rating.append(index)
        counter = 0
    counter += 1

print("All Professor ratings: ", pro_rating)    
print("All professor names: ", pro_name)
print("Amount of times professor rated: ", pro_amount_rating)
现在,在添加姓名(pro_姓名)和评级金额(pro_amount_评级)时,一切都很顺利,但pro_评级总是写出完整的列表

我完全理解为什么会发生这种情况,这是因为当计数器达到3时,我会重置计数器,计数器在最后加1,使第一个if语句始终为真

我想放置一个标志或第二个参数来解决这个问题,但我似乎无法理解,我知道我可以很容易地制作另一个forloop来解决这个问题,但我想在这个forloop中完成它们

如果有人有任何想法,我将不胜感激

输出:

All Professor ratings:  ['3.8', 'Weiss, Earl', '139 RATINGS', '2.3', 'Jeppson, Catherine', '114 RATINGS', '3.3', 'Kiani-Aslani, Rajabali', '88 RATINGS', '2.6', 'Lundblad, Heidemarie', '82 RATINGS', '2.4', 'Stone, Ronald', '75 RATINGS', '3.7', 'Vedd, Rishma', '66 RATINGS', '3.3', 'Foster, Robert', '60 RATINGS', '4.9', 'Basmadzhyan, Babken', '59 RATINGS', '4.3', 'Grodsky, Marilyn', '57 RATINGS', '2.4', 'Dorsey, Norris', '53 RATINGS', '2.6', 'Zvinakis, Kristina', '51 RATINGS', '3.2', 'MacKlin, James', '50 RATINGS', '2.8', 'Liu, David', '48 RATINGS', '3.2', 'Doron, Michael', '48 RATINGS', '2.1', 'Rogoff, Donald', '45 RATINGS', '3.1', 'Sangeladji, Mohammad', '43 RATINGS', '4.0', 'Fountaine, Howard', '42 RATINGS', '4.6', 'Stout, Gary', '41 RATINGS', '3.4', 'Gray, Glen', '34 RATINGS', '3.0', 'Wilson, Barbara', '31 RATINGS', '4.0', 'Yoon, Sung-Wook', '31 RATINGS', '4.5', 'Her, Young-Won', '31 RATINGS', '3.0', 'Kiddoo, Robert', '30 RATINGS', '3.0', 'Chiu, J', '27 RATINGS', '3.3', 'Barker, Robert', '25 RATINGS', '3.7', 'Qureshi, Mahmood', '23 RATINGS', '3.7', 'Primes, David', '22 RATINGS', '2.6', 'Chen, Raymond', '20 RATINGS', '3.3', 'Jones, Christopher', '20 RATINGS', '3.2', 'Zhan, Jun', '20 RATINGS', '4.6', 'Bell, Janice', '15 RATINGS', '3.8', 'Alhashim, Dhia D', '12 RATINGS', '2.9', 'Ansari, Shahid', '11 RATINGS', '4.5', 'Rousselet, Robin (rob)', '9 RATINGS', '2.4', 'Lucero, Terrence', '8 RATINGS', '1.0', 'Perez, Marlene', '7 RATINGS', '1.3', 'Crespo, Patricia', '7 RATINGS', '4.8', 'Knight, Ridgeway', '7 RATINGS', '2.5', 'Julius, Ed', '6 RATINGS', '2.9', 'Reinstein, Todd', '6 RATINGS']
All professor names:  ['Weiss, Earl', 'Jeppson, Catherine', 'Kiani-Aslani, Rajabali', 'Lundblad, Heidemarie', 'Stone, Ronald', 'Vedd, Rishma', 'Foster, Robert', 'Basmadzhyan, Babken', 'Grodsky, Marilyn', 'Dorsey, Norris', 'Zvinakis, Kristina', 'MacKlin, James', 'Liu, David', 'Doron, Michael', 'Rogoff, Donald', 'Sangeladji, Mohammad', 'Fountaine, Howard', 'Stout, Gary', 'Gray, Glen', 'Wilson, Barbara', 'Yoon, Sung-Wook', 'Her, Young-Won', 'Kiddoo, Robert', 'Chiu, J', 'Barker, Robert', 'Qureshi, Mahmood', 'Primes, David', 'Chen, Raymond', 'Jones, Christopher', 'Zhan, Jun', 'Bell, Janice', 'Alhashim, Dhia D', 'Ansari, Shahid', 'Rousselet, Robin (rob)', 'Lucero, Terrence', 'Perez, Marlene', 'Crespo, Patricia', 'Knight, Ridgeway', 'Julius, Ed', 'Reinstein, Todd']
Amount of times professor rated:  ['139 RATINGS', '114 RATINGS', '88 RATINGS', '82 RATINGS', '75 RATINGS', '66 RATINGS', '60 RATINGS', '59 RATINGS', '57 RATINGS', '53 RATINGS', '51 RATINGS', '50 RATINGS', '48 RATINGS', '48 RATINGS', '45 RATINGS', '43 RATINGS', '42 RATINGS', '41 RATINGS', '34 RATINGS', '31 RATINGS', '31 RATINGS', '31 RATINGS', '30 RATINGS', '27 RATINGS', '25 RATINGS', '23 RATINGS', '22 RATINGS', '20 RATINGS', '20 RATINGS', '20 RATINGS', '15 RATINGS', '12 RATINGS', '11 RATINGS', '9 RATINGS', '8 RATINGS', '7 RATINGS', '7 RATINGS', '7 RATINGS', '6 RATINGS', '6 RATINGS']
已解决: 谢谢Michael的解决方案,我用了一个简单的
计数器==1,2。。。解决了问题,不再使用模运算,而是将行
计数器%1==0
更改为
计数器%3==0
,这样会更干净。请记住,您需要每三个元素,因此您需要使用3进行模数转换,并检查余数是否为0


然后,您可以停止重置第三个if块中的计数器,并将其更改为
计数器%3==2
。我将把它作为一个练习来计算中间的if块应该是什么。

您可以创建一个嵌套列表,存储评分、教授姓名以及后者被评分的次数:

from collections import namedtuple
import re
professor = namedtuple('professor', ['rating', 'name', 'ratings'])
d = ['3.8', 'Weiss, Earl', '139 RATINGS', '2.3', 'Jeppson, Catherine', '114 RATINGS', '3.3', 'Kiani-Aslani, Rajabali', '88 RATINGS', '2.6', 'Lundblad, Heidemarie', '82 RATINGS', '2.4', 'Stone, Ronald', '75 RATINGS', '3.7', 'Vedd, Rishma', '66 RATINGS', '3.3', 'Foster, Robert', '60 RATINGS', '4.9', 'Basmadzhyan, Babken', '59 RATINGS', '4.3', 'Grodsky, Marilyn', '57 RATINGS', '2.4', 'Dorsey, Norris', '53 RATINGS', '2.6', 'Zvinakis, Kristina', '51 RATINGS', '3.2', 'MacKlin, James', '50 RATINGS', '2.8', 'Liu, David', '48 RATINGS', '3.2', 'Doron, Michael', '48 RATINGS', '2.1', 'Rogoff, Donald', '45 RATINGS', '3.1', 'Sangeladji, Mohammad', '43 RATINGS', '4.0', 'Fountaine, Howard', '42 RATINGS', '4.6', 'Stout, Gary', '41 RATINGS', '3.4', 'Gray, Glen', '34 RATINGS', '3.0', 'Wilson, Barbara', '31 RATINGS', '4.0', 'Yoon, Sung-Wook', '31 RATINGS', '4.5', 'Her, Young-Won', '31 RATINGS', '3.0', 'Kiddoo, Robert', '30 RATINGS', '3.0', 'Chiu, J', '27 RATINGS', '3.3', 'Barker, Robert', '25 RATINGS', '3.7', 'Qureshi, Mahmood', '23 RATINGS', '3.7', 'Primes, David', '22 RATINGS', '2.6', 'Chen, Raymond', '20 RATINGS', '3.3', 'Jones, Christopher', '20 RATINGS', '3.2', 'Zhan, Jun', '20 RATINGS', '4.6', 'Bell, Janice', '15 RATINGS', '3.8', 'Alhashim, Dhia D', '12 RATINGS', '2.9', 'Ansari, Shahid', '11 RATINGS', '4.5', 'Rousselet, Robin (rob)', '9 RATINGS', '2.4', 'Lucero, Terrence', '8 RATINGS', '1.0', 'Perez, Marlene', '7 RATINGS', '1.3', 'Crespo, Patricia', '7 RATINGS', '4.8', 'Knight, Ridgeway', '7 RATINGS', '2.5', 'Julius, Ed', '6 RATINGS', '2.9', 'Reinstein, Todd', '6 RATINGS']
grouped_data = [d[i:i+3] for i in range(0, len(d), 3)]
results = [professor(float(a), b, int(re.findall('^\d+', c)[0])) for a, b, c in grouped_data]
输出:

[professor(rating=3.8, name='Weiss, Earl', ratings=139), professor(rating=2.3, name='Jeppson, Catherine', ratings=114), professor(rating=3.3, name='Kiani-Aslani, Rajabali', ratings=88), professor(rating=2.6, name='Lundblad, Heidemarie', ratings=82), professor(rating=2.4, name='Stone, Ronald', ratings=75), professor(rating=3.7, name='Vedd, Rishma', ratings=66), professor(rating=3.3, name='Foster, Robert', ratings=60), professor(rating=4.9, name='Basmadzhyan, Babken', ratings=59), professor(rating=4.3, name='Grodsky, Marilyn', ratings=57), professor(rating=2.4, name='Dorsey, Norris', ratings=53), professor(rating=2.6, name='Zvinakis, Kristina', ratings=51), professor(rating=3.2, name='MacKlin, James', ratings=50), professor(rating=2.8, name='Liu, David', ratings=48), professor(rating=3.2, name='Doron, Michael', ratings=48), professor(rating=2.1, name='Rogoff, Donald', ratings=45), professor(rating=3.1, name='Sangeladji, Mohammad', ratings=43), professor(rating=4.0, name='Fountaine, Howard', ratings=42), professor(rating=4.6, name='Stout, Gary', ratings=41), professor(rating=3.4, name='Gray, Glen', ratings=34), professor(rating=3.0, name='Wilson, Barbara', ratings=31), professor(rating=4.0, name='Yoon, Sung-Wook', ratings=31), professor(rating=4.5, name='Her, Young-Won', ratings=31), professor(rating=3.0, name='Kiddoo, Robert', ratings=30), professor(rating=3.0, name='Chiu, J', ratings=27), professor(rating=3.3, name='Barker, Robert', ratings=25), professor(rating=3.7, name='Qureshi, Mahmood', ratings=23), professor(rating=3.7, name='Primes, David', ratings=22), professor(rating=2.6, name='Chen, Raymond', ratings=20), professor(rating=3.3, name='Jones, Christopher', ratings=20), professor(rating=3.2, name='Zhan, Jun', ratings=20), professor(rating=4.6, name='Bell, Janice', ratings=15), professor(rating=3.8, name='Alhashim, Dhia D', ratings=12), professor(rating=2.9, name='Ansari, Shahid', ratings=11), professor(rating=4.5, name='Rousselet, Robin (rob)', ratings=9), professor(rating=2.4, name='Lucero, Terrence', ratings=8), professor(rating=1.0, name='Perez, Marlene', ratings=7), professor(rating=1.3, name='Crespo, Patricia', ratings=7), professor(rating=4.8, name='Knight, Ridgeway', ratings=7), professor(rating=2.5, name='Julius, Ed', ratings=6), professor(rating=2.9, name='Reinstein, Todd', ratings=6)]

您可以使用列表切片以更少的代码实现所需的功能

pro_rating        = temp1[0::3]
pro_name          = temp1[1::3]
pro_amount_rating = temp1[2::3]
这会将第一个元素分类为评级,第二个元素分类为名称,第三个元素分类为金额,每三个元素重复一次

您可以使用enumerate。此外,如果使用n%i,则不需要将计数器设置为0。例如,3%3==6%3==9%3=0,等等

你在问题的根源上错了: 计数器%1==0实际上意味着计数器是1的倍数吗

每个数字都是1的倍数。
通过重置为0可以避免2和3的问题,因为它们是素数,但请记住6%3=6%2=6%1

如果计数器==1:,
如果计数器==2:
,…我不明白为什么我甚至没有想到LOL,多亏了巴德工作得像个charmYou可以使用
枚举
。此外,如果使用
n%i
,则不需要将计数器设置为0。例如,
3%3==6%3==9%3=0
,等等……哦,我也没有意识到这一点,谢谢你的提示!哇,这看起来非常干净,肯定会使用这种方法我真的很喜欢你的格式,这使信息看起来非常干净,我将不得不采取这一点,并分析它,看看到底发生了什么我欣赏这些信息!