如何将我的代码转换为列表理解

时间:2019-09-14 11:06:04

标签: python python-3.x list function list-comprehension

我已经编写了这段代码,以使其生成4个随机整数(范围为1-6),然后删除最小的数字并将其添加到返回的列表中。

我在阅读,发现列表推导是更“ pythonic”的解决方案,而不是较小的范围循环。我想知道如何以列表理解的方式编写此代码,对您的帮助将不胜感激。

stats = []

for stat in range(6):
    score = [random.randint(1, 6) for n in range(4)]
    score.remove(min(score))
    stats.append(sum(score))

return stats

3 个答案:

答案 0 :(得分:0)

在Python 3.7或更低版​​本中,您可以使用列表推导和生成器表达式的以下组合来做到这一点:

stats = [sum(score := [random.randint(1, 6) for n in range(4)]) - min(score) for stat in range(6)]

在Python 3.8(仍处于beta版)中,借助新的walrus赋值运算符,您可以以更简单的方式实现它:

<=

您可以here试试。

测试两种方法:

理解(import random random.seed(1) stats = [sum(score) - min(score) for score in ([random.randint(1, 6) for n in range(4)] for stat in range(6))] print(stats) Python 3.7):

[10, 12, 12, 12, 15, 14]

输出:

import random

random.seed(1)

stats = [sum(score := [random.randint(1, 6) for n in range(4)]) - min(score) for stat in range(6)]

print(stats)

理解力+海象(Python 3.8):

[10, 12, 12, 12, 15, 14]

输出:

0

答案 1 :(得分:0)

这是我的尝试:

我定义了一个在使用列表推导之前生成得分的函数。

def old_macdonald(name):
    firstLetter = name[0].capitalize()
    fourthLetter = name[3].capitalize()
    inBetween = name[1:3]
    last = name[4:]
    newName = firstLetter + inBetween + fourthLetter + last
    if len(newName) < 4:
        print("name is too short.")
    else:
        print(newName)
old_macdonald("mac")

enter image description here

答案 2 :(得分:-1)

尝试一下:

from random import randint
[min([randint(1, 6) for _ in range(4)]) for _ in range(6)]

但是,这变得有些复杂且难以阅读,因此也许不是最佳解决方案。