Python - 在和不在列表语法错误中

标签 python list list-comprehension

我正在尝试从另一个现有的 float 列表构建一个新的 float 列表。第一个列表的预期内容更容易通过示例识别:

price_list = [39.99, 74.99, 24.99, 49.99]

预期的后置函数:

print new_price_list
>>[29.99, 34.99, 44.99, 54.99, 59.99, 64.99, 69.99]

新列表是通过查看现有列表的范围并从现有列表中的最小值开始,附加现有列表中不存在的 float += 5.00 得出的。我最初的解决方案尝试是:

price_list = [39.99, 74.99, 24.99, 49.99]

min_price = min(price_list)

new_price_list = []
while min_price < max(price_list):
    if min_price not in price_list:
        new_price_list.append(min_price)
    min_price += 5.00

for price in new_price_list:
    print price

>>29.99
>>34.99
>>39.99
>>44.99
>>49.99
>>54.99
>>59.99
>>64.99
>>69.99

仅供引用:

print new_price_list
>>[29.99, 34.989999999999995, 39.989999999999995, 44.989999999999995, 49.989999999999995, 54.989999999999995, 59.989999999999995, 64.99, 69.99]

与此同时,我发现了我认为的问题,即如何将 min_price 与 price_list 中的项目进行比较。我尴尬的解决方法如下。但是,我仍然很好奇是否有更有效地完成这项任务的方法,正如我在最初的解决方案猜测中所寻求的那样,或者甚至可能更多地使用列表理解,即使 min_price += 5.00?

price_list = [39.99, 74.99, 24.99, 49.99]

min_price = min(price_list)

new_price_list = []
while min_price < max(price_list):
    if int(min_price) not in [int(price) for price in price_list]:
        new_price_list.append(int(min_price))
    min_price += 5.00

better_price_list = [price + 0.99 for price in new_price_list]
print better_price_list

[29.99, 34.99, 44.99, 54.99, 59.99, 64.99, 69.99]

非常感谢您的帮助!期待更好地了解这个社区。

最佳答案

要生成值、最小值和最大值并创建自定义范围生成器:

mn = min(price_list)

mx = max(price_list)


def flt_rnge(start, stop, step):
    start += step
    while start < stop:
        yield start
        start += step


print(list(flt_rnge(mn, mx, 5)))

输出以下不是语法错误,它是 repr 输出:

[29.99, 34.989999999999995, 39.989999999999995, 44.989999999999995, 49.989999999999995, 54.989999999999995, 59.989999999999995, 64.99, 69.99]

如果您想要的值不在您的列表中,您可以使用 set 来存储列表中已经存在的价格,但您将遇到 floating-point-arithmetic-issues在比较花车时,在这种情况下,在处理金钱时,你应该使用 decimal模块:

price_list = [39.99, 74.99, 24.99, 49.99]

mn = min(price_list)
mx = max(price_list)

from decimal import Decimal
def flt_rnge(start, stop, step, l):
    st = map(str, l)
    start,stop,step = Decimal(str(start)),Decimal(str(stop)),Decimal(str(step))
    start += step
    while start < stop:
        if start not in st:
            yield start
        start += step


print(list(flt_rnge(mn, mx, 5, price_list)))
[Decimal('29.99'), Decimal('34.99'), Decimal('44.99'), Decimal('54.99'), Decimal('59.99'), Decimal('64.99'), Decimal('69.99')]

你在问题​​的第一部分打印输出,所以你看到格式很好的输出,当你在看到 repr 后打印列表时,显示存储的浮点值实际上不等于 xx.99 所以所有你的如果 x 不在列表中

在处理金钱时,您应该从一开始就使用 decimal 模块。

关于Python - 在和不在列表语法错误中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32533052/

相关文章:

python - 使 python 类列表的列表索引成为可能

python - 计算列表元素时区分 0 和 False

Python在二进制中找到最大组合数

python - 根据部分字符串在列表中查找条目

python - 使用 Airflow,MsSqlOperator 是否接受来自 SQL Server 的响应?

python - 在Python中将文件直接上传到FTP服务器

python - 根据条件在任意嵌套列表中查找组合

python - 高效使用 Python 列表推导式

python - 在docker上运行uwsgi导致没有这样的文件或目录

Python:将日期时间提取为年、月和日结果为 float