【问题标题】:Iterating over a list of strings that may be of length 1迭代可能长度为 1 的字符串列表
【发布时间】:2022-01-10 21:00:30
【问题描述】:

假设我生成了一个字符串列表:

def printList(list)
    for i in list:
        print(i)

string = 'hello,world,!'
strings = string.split(',')
printList(strings)

这很好用。但是,如果字符串只有一个元素长,或者我想使用不可迭代的类型调用 printList,那么这将分崩离析。考虑以下(更相关的)示例:

my_list=[]
def add_items_filtered(items)
    for item in items:
        if item > 5: #arbitrary filter
            my_list.append(item)

add_items_filtered([4,5,6,7]) #this works fine
add_items_filtered(6) #this fails

这里的问题是我发送的项目不是“可迭代的”。我可以解决这个问题:

if not isinstance(items, list):
    items=[items]

但这似乎是一个 hack。通过强制此函数的调用者将我发送到列表中,这是唯一真正的方法吗?被这样一个简单的问题所阻碍似乎违反直觉。

【问题讨论】:

  • 如果你给它一些不是列表的东西,那么函数的预期返回值是多少。比如add_items_filtered(some_non_iterable),你希望函数在这种情况下返回什么?
  • 不,这不是 hack。事实上,这就是类型系统在大多数编程语言中的工作方式。
  • 您实际上想要完成什么?比如,你会在什么情况下使用这个函数?这似乎是一个XY problem,因为在向量(列表)上工作的函数接受标量(int)并没有真正意义。也许您想改用*args
  • try-except 也是另一种解决方案。
  • 此函数的目的是将传入的任何内容添加到列表中(在应用过滤器之后)。我希望调用者能够转储到要添加的对象列表中,而不必自己循环并顺序调用 add 函数

标签: python list


【解决方案1】:

如果您想要解决方法,请使用

def add_items_filtered(*items):

然后你可以传递类似的参数

add_items_filtered(4,5,6,7)
add_items_filtered(6)

否则,您将不得不检查类型,循环遍历一个元素的列表并没有错。

【讨论】:

  • “循环遍历一个元素的列表没有任何问题”。 Python 会抛出类型错误,因为传入的元素是不可迭代的。它试图迭代项目而不是隐式列表 - 这需要类型检查
  • @BrydonGibson 这不是我所指的。正如错误所说,您没有列表。我只是指你可以拥有for x in range(1)
  • 明白了——这是有道理的,作为一个停留在较低级别的人,很难说python会隐含地为你做什么,它不会为你做什么
猜你喜欢
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 2019-07-15
  • 2018-07-22
  • 2018-06-25
  • 2020-03-04
相关资源
最近更新 更多