设置最大长度参数的 Pythonic 方式
Pythonic way to set a maximum length parameter
设置最大长度参数的 pythonic 方法是什么?
假设我想将字符串列表限制为某个最大大小:
>>> x = ['foo', 'bar', 'a', 'rushmoreorless', 'kilimangogo']
>>> maxlen = 3
>>> [i for i in x if len(i) <= maxlen]
['foo', 'bar', 'a']
我想对其进行功能化并允许不同的 maxlen,但如果没有给出 maxlen,它应该 return 完整列表:
def func1(alist, maxlen):
return [i for i in x if len(i) <= maxlen]
我想将 maxlen 设置为 alist 中元素的最大长度,所以我尝试了,但我在使用 None
、0
或 -1
之间左右为难。
如果我使用 None
,稍后将很难转换类型:
def func1(alist, maxlen=None):
if maxlen == None:
maxlen = max(alist, key=len)
return [i for i in x if len(i) <= maxlen]
我可能会得到这个,因为函数建立在:
>>> maxlen = None
>>> int(None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'NoneType'
>>> type(maxlen)
<type 'NoneType'>
如果我使用 -1,它可以解决 int(maxlen)
问题,但它也有点奇怪,因为长度永远不应该为负数。
def func1(alist, maxlen=-1):
if maxlen < 0:
maxlen = max(alist, key=len)
return [i for i in x if len(i) <= maxlen]
如果我使用 0,当我真的需要 return 一个空列表并设置 maxlen=0
时,我会遇到问题,但是话又说回来,如果我真的需要一个空列表,那么我不需要甚至需要一个函数来创建一个。
def func1(alist, maxlen=0):
if maxlen == 0:
maxlen = max(alist, key=len)
return [i for i in x if len(i) <= maxlen]
(注意:最终任务不是过滤列表,即 (filter(lambda k: len(k) <= maxlen, lst))
但它是一个示例,用于询问设置最大值的整数变量的 pythonic 方法)
Let's say I want to restrict a list of strings to a certain maximum size:
And I want to functionalize it and allow different maxlen but if no maxlen is given, it should return the full list:
And I want to set the maxlen to the max length of element in alist
为了解决所有这些请求,我能想到的最佳答案是这样的...
def func(lst, ln=None):
if not ln:
return lst
ln = max(ln, len(lst))
return [i for i in lst if len(i) <= ln]
编辑:
如果处理负的最大长度(谁知道为什么)或 0 长度很重要,那么可以使用这样的函数。 (虽然我反对鸭子打字)
def func(lst, ln=None):
if ln is None:
return lst
elif ln < 1: # handles 0, and negative values.
return []
else:
ln = max(ln, len(lst))
return [i for i in lst if len(i) <= ln]
下面的方法怎么样,这样可以避免使用max
:
def filter_length(a_list, max_length=None):
if max_length == 0:
return []
elif max_length:
return [i for i in x if len(i) <= max_length]
else:
return a_list
x = ['foo', 'bar', 'a', 'rushmoreorless', 'kilimangogo']
print filter_length(x, 3)
print filter_length(x)
print filter_length(x, 0)
给你输出:
['foo', 'bar', 'a']
['foo', 'bar', 'a', 'rushmoreorless', 'kilimangogo']
[]
有什么技巧吗?..运算符or
returns第一个值,如果两个值都是True
。并且,如果第一个值为 False
,第二个值为 True
,则 or
returns 第二个值为
>>> m = 3
>>> [i for i in x if len(i) <= m] or x
['foo', 'bar', 'a']
>>> m = 0
>>> [i for i in x if len(i) <= m]
[]
>>> [i for i in x if len(i) <= m] or x
['foo', 'bar', 'a', 'rushmoreorless', 'kilimangogo']
我认为这正是您所需要的。 :-)
哎呀...我忘了 -1
和 None
。结果将相同:
>>> m = None
>>> [i for i in x if len(i) <= m] or x
['foo', 'bar', 'a', 'rushmoreorless', 'kilimangogo']
>>> m = -1
>>> [i for i in x if len(i) <= m] or x
['foo', 'bar', 'a', 'rushmoreorless', 'kilimangogo']
正如您所说:“我想允许不同的 maxlen
,但如果没有给出 maxlen
,它应该 return 完整列表”。
一种方法是使用 Python default argument values:
maxFilter()
函数
>>> def maxFilter(alist, maxlen = None):
if maxlen is None:
#no maxlen is given -> return full list
return alist
else:
#in all other cases apply algorithm
return [i for i in x if len(i) <= maxlen]
示例,使用 x = ['foo', 'bar', 'a', 'rushmoreorless', 'kilimangogo']
:
>>> maxFilter(x, None) #same as maxFilter(x)
['foo', 'bar', 'a', 'rushmoreorless', 'kilimangogo']
>>> maxFilter(x, 3)
['foo', 'bar', 'a']
>>> maxFilter(x, 0)
[]
注意:在我看来,最好询问一种设置可选长度参数的方法列出元素 .