确保python列表的值范围

时间:2014-03-26 22:31:27

标签: python list

我想要一个带有列表的函数,并返回该列表,其中任何元素小于0或大于" upper"除去。

我想出了如何通过列表理解来做到这一点,但我无法弄清楚为什么这不起作用:

dim = 4

def ensure_values(l, upper=dim**2):
    for i in l:
        if i < 0 or i >= upper:
            l.remove(i)
    return l

l = [0,2,-3,5]

ensure_values(l)
[0,2,-3,5]

我期待[0,2,5]。

3 个答案:

答案 0 :(得分:3)

Python中的最佳实践是让您的函数返回仅包含所需元素的新列表。最好用列表理解来完成。

dim = 4

def ensure_values(lst, upper=dim**2):
    return [n for n in lst if 0 < n <= upper]

lst = [0,2,-3,5]

assert ensure_values(lst) == [2, 5]

请注意,我能够使用表达式0 < n <= upper。这在C语言或大多数其他语言中都不合法,但在Python中它是合法的,并且做了人们期望它做的事情。

另外,我建议不要使用l作为变量名。它看起来几乎与许多字体中的1I完全相同。建议的做法是使用lstL作为列表的简称。

在PEP 8编码风格的Python指南中特别不推荐使用l作为变量名。这是一个链接:

http://legacy.python.org/dev/peps/pep-0008/#id29

答案 1 :(得分:1)

你可以改变你的循环,以便迭代列表的副本,这样就可以避免修改你重复的列表,因为在许多情况下它不会起作用。

dim = 4

def ensure_values(l, upper=dim**2):
    for i in l[:]:  # iterate over copy of list
        if i < 0 or i >= upper:
            l.remove(i)
    return l

l = [0, 2, -3, 20, 5]

print ensure_values(l)  # -> [0, 2, 5]

更多&#34; Pythonic&#34;这样做的方法 - 因为它更短,并且不需要列表的副本 - 将使用列表理解。请注意,条件必须反转,因为它现在用于确定何时保留元素。

l = [i for i in l if i >= 0 and i < dim**2]

print l  # -> [0, 2, 5]

答案 2 :(得分:0)

为什么不使用过滤器?

def ensure_values(l, upper=dim**2):
   return filter(lambda x: x>0 or x<upper, l)