Python - In和Not In List语法错误

时间:2015-09-11 22:32:02

标签: python list list-comprehension

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

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]

新列表是通过查看现有列表的范围得出的,并且从现有列表中的最小值开始,附加现有列表中不存在的浮点数+ = 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]

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

4 个答案:

答案 0 :(得分:2)

要生成值,min和max并创建自定义范围生成器:

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所以全部你的if x not in list

在处理金钱时,您应该从头开始使用十进制模块。

答案 1 :(得分:0)

这样的事情可能就是你想要的......

upper_bound = max(int(p) for p in price_list)
lower_bound = min(int(p) for p in price_list)
new_price_list = [(p+0.99) for p in range(lower_bound, upper_bound, 5) 
                         if (p+0.99) not in price_list]

答案 2 :(得分:0)

这是实现所需目标的另一种方式:

price_list = [39.99, 74.99, 24.99, 49.99]

min_price = min(price_list)
max_price = max(price_list)

new_price_list = [min_price + 5.00]
for i in new_price_list:
    if i < max_price - 5.00:
        num = i+5.00
        num = round(num,2)
        new_price_list.append(num)
print new_price_list

输出:

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

答案 3 :(得分:-1)

你真的保证价格会以0.99结束吗?如果没有,那么您的解决方案和新提案都将在实际数据上失败。

我建议您先将价格转换为美分:

pennies_list = [round(100*p) for p in price_list]

现在你可以去寻找丢失的价格。 找到便士列表的min_price和max_price值,如polpak所示。

full_list = [p for p in range(min_price, max_price, 500) ]
original_set = set(pennies_list)
full_set = set(full_list)
new_set = full_set - original_set
new_price_list = list(new_set)