【问题标题】:Python list() function on (non) iterable(非)可迭代的 Python list() 函数
【发布时间】:2019-06-13 04:06:12
【问题描述】:

我遇到了list() 函数的问题。我有一个简单的课程

class Foo(object):
   def __init__(self, value):
      self.value = value    

我正在尝试使用Foo 对象构建一个列表:

lhs = list(Foo(1))
...
rhs = list(Foo(2))

return lhs + rhs

期望的结果应该是[Foo(1), Foo(2)]。但是我需要在递归调用中使用这样的结果,所以在接下来的步骤中,这个结果成为lhslist() 函数的参数,我想用另一个Foo 元素附加这样的列表:

lhs = list([Foo(1), Foo(2)])
...
rhs = list(Foo(3))

return lhs + rhs

最终结果应该是[Foo(1), Foo(2), Foo(3)]。问题是list(Foo(1)) 函数引发了TypeError,因为Foo 是不可迭代的。有什么办法可以解决吗?

编辑

更好的用例:

def create_foo(value):
   return Foo(value)

def concatenate(lhs, rhs):
   return list(lhs) + list(rhs)


concatenate(concatenate(create_foo(1), create_foo(2)), create_foo(3))

【问题讨论】:

  • list((Foo(1),))?或者只是[Foo(1)]
  • @jonrsharpe 我添加了一个更好的例子。 [Foo(1)] 将创建不是所需结果的嵌套列表
  • 您为什么要同时将Foo 实例和Foo 实例序列传递给concatenate?这似乎是个坏主意。

标签: python-3.x list


【解决方案1】:

您可以只检查列表并使用.extend 进行连接,或使用.append 添加非列表项:

class Foo:
    def __init__(self, value):
        self.value = value
    def __repr__(self):
        return f'Foo({self.value})'

def concat(*args):
    result = []
    for arg in args:
        if isinstance(arg,list):
            result.extend(arg)
        else:
            result.append(arg)
    return result

a = concat(Foo(1),Foo(2),Foo(3))
print(a)
b = concat(Foo(6),Foo(7))
print(b)
c = concat(a,Foo(4),Foo(5),b)
print(c)

输出:

[Foo(1), Foo(2), Foo(3)]
[Foo(6), Foo(7)]
[Foo(1), Foo(2), Foo(3), Foo(4), Foo(5), Foo(6), Foo(7)]

【讨论】:

  • 绝妙的解决方案!非常感谢
猜你喜欢
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多