【问题标题】:Sorting elements in a list into 3 individual lists python将列表中的元素排序为3个单独的列表python
【发布时间】:2019-02-12 06:49:26
【问题描述】:

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

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_names) 和评分数量 (pro_amount_rating) 时,一切正常,但 pro_rating 总是写出完整列表。

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

我正在考虑放置一个标志或第二个参数来解决这个问题,但我似乎无法弄清楚,我知道我可以轻松地制作另一个 forloop 来解决这个问题,但我想把它们全部搞定在这个单一的 for 循环中完成。

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

输出:

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']

已解决: 谢谢迈克尔的解决方案,我想得太清楚了,使用一个简单的 counter == 1, 2... 解决了问题,而不是使用模数再次感谢

【问题讨论】:

  • 试试if counter == 1:, if counter == 2:, ...
  • 好吧,我不明白为什么我什至没有想到那个 LOL,非常感谢 bud 就像一个魅力
  • 你可以使用enumerate。另外,如果使用n%i,则不需要将计数器设置为0。例如,3%3 == 6%3 == 9%3 = 0等...
  • 哦,我也没有意识到这一点,谢谢你的提示!

标签: python python-3.x loops for-loop


【解决方案1】:

counter % 1 == 0 改为counter % 3 == 0 会更简洁。请记住,您需要每隔三个元素,因此您需要用 3 取模并检查余数是否为 0。

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

【讨论】:

    【解决方案2】:

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

    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)]
    

    【讨论】:

    • 我真的很喜欢你的格式,这使信息看起来非常干净,我将不得不接受它并分析它以确切了解发生了什么我感谢这些信息!跨度>
    【解决方案3】:

    您可以使用列表切片以更少的代码实现您想要的。

    pro_rating        = temp1[0::3]
    pro_name          = temp1[1::3]
    pro_amount_rating = temp1[2::3]
    

    这会将第 1 个元素排序为 rating,将第 2 个元素排序为 name,将第 3 个元素排序为 amount,对每个第 3 个元素重复。

    【讨论】:

    • 哇这看起来非常干净,一定会用这个方法
    【解决方案4】:

    您可以只使用枚举。另外,如果使用 n%i,则不需要将 counter 设置为 0。例如,3%3 == 6%3 == 9%3 = 0 等...

    您在问题的根源上错了: counter % 1 == 0 实际上意味着 counter 是 1 的倍数?

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

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 2021-05-29
      • 2016-12-04
      相关资源
      最近更新 更多