设置最大长度参数的 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 中元素的最大长度,所以我尝试了,但我在使用 None0-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']

我认为这正是您所需要的。 :-)

哎呀...我忘了 -1None。结果将相同:

>>> 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)
[]

注意:在我看来,最好询问一种设置可选长度参数的方法列出元素 .