如果满足条件,则列出更新值的理解

2024-04-28 21:16:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下列表和变量I:

probs = [1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9]
i = 3

我想将变量I中给出的索引列表中的值更改为3/9,其余值更改为8/9。 因此,上述条件下的预期结果为:

probs = [8/9, 8/9, 8/9, 3/9, 8/9, 8/9, 8/9, 8/9, 8/9]

我更喜欢用列表理解来提高效率,有什么想法吗


Tags: 列表条件probs提高效率
3条回答

我建议使用Python的fractions模块进行概率计算

因此,您的解决方案可以是:

from fractions import Fraction
probs = ["1/9", "1/9", "1/9", "1/9", "1/9", "1/9", "1/9", "1/9", "1/9"]
# rather than integer convert it to Fraction, or simply use fractions only from beginning.
probs = [Fraction(i) for i in probs]  # convert like this
# or use directly as below:
probs = [Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9)]

我相信在概率上,你必须进行数学运算,所以你可以做如下操作:

In [12]: print(probs)
[Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9), Fraction(1, 9)]

In [13]: i = 3

In [15]: new_probs = [Fraction(3, 9) if prob==i else Fraction(8, 9) for prob in probs]

In [16]: print(new_probs)
[Fraction(8, 9), Fraction(8, 9), Fraction(8, 9), Fraction(8, 9), Fraction(8, 9), Fraction(8, 9), Fraction(8, 9), Fraction(8, 9), Fraction(8, 9)]

或者假设您实际执行1 - Probability运算并乘以3进行匹配,那么它仍然可以使用分数运算,正如您期望使用概率函数执行的那样:

In [17]: new_probs = [3*prob if prob==i else 1-prob for prob in probs]

In [18]: print(new_probs)
[Fraction(8, 9), Fraction(8, 9), Fraction(8, 9), Fraction(2, 3), Fraction(8, 9), Fraction(8, 9), Fraction(8, 9), Fraction(8, 9), Fraction(8, 9)]

您可以使用列表中的表达式来执行此操作

probs = [3 / 9 if i == index else 8 / 9 for index, _ in enumerate(probs)]

下面是一个列表,可以满足您的要求:

probs = ["1/9", "1/9", "1/9", "1/9", "1/9", "1/9", "1/9", "1/9", "1/9"]
i = 3

probs = ["3/9" if idx == i else "8/9" for idx in range(len(probs))]
print(probs)
# Prints ['8/9', '8/9', '8/9', '3/9', '8/9', '8/9', '8/9', '8/9', '8/9']

请注意,我将分数转换为字符串,否则它们将被打印为浮点数。如果希望它们成为浮动,可以执行以下操作:

probs = [1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9]
i = 3

probs = [3/9 if idx == i else 8/9 for idx in range(len(probs))]
print(probs)
# Prints [0.8888888888888888, 0.8888888888888888, 0.8888888888888888, 0.3333333333333333, 0.8888888888888888, 0.8888888888888888, 0.8888888888888888, 0.8888888888888888, 0.8888888888888888]

另外,请注意,此列表理解实际上并不比正常的for循环快

相关问题 更多 >