How to check if an element of a list is a list (in Python)?
如果我们有以下列表:
1
| list = ['UMM', 'Uma', ['Ulaster','Ulter']] |
如果我需要知道列表中的元素本身是否是列表,我可以用什么替换下面代码中的avalidlist?
1 2 3
| for e in list:
if e == aValidList:
return True |
号
有特殊的进口货要用吗?有没有检查变量/元素是否为列表的最佳方法?
- 如果变量是列表或元组,则测试可能重复
- 你为什么需要那个?你想把你的名单拉平吗?
- 另外:(1)不要使用list作为变量名,因为它将隐藏内置的list()。(2)圆括号的意思是什么?
- @Rikpoggi这是我正在尝试的练习。最初,我们被要求浏览一个标准列表,并返回以大写"U"开头的元素计数。我想看看是否可以扩展它来搜索列表和子列表中相同的内容并返回计数。因此,如果上面的列表是输入,那么过程将返回四个计数。()是打字错误。-)
使用isinstance:
如果要检查对象是列表或元组,请将几个类传递给isinstance:
1
| if isinstance(e, (list, tuple)): |
号
计算出您希望这些项目具有的list的特定属性。它们需要可索引吗?是否灵活?他们需要一个.append()方法吗?
查找描述collections模块中特定类型的抽象基类。
使用isinstance:
1
| isinstance(x, collections.MutableSequence) |
你可能会问"为什么不直接使用type(x) == list"?你不应该这样做,因为那样你就不支持像列表一样的东西。Python的一部分心态是鸭子打字:
I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck
号
换句话说,您不应该要求对象是lists,只要它们有您需要的方法。EDCOX1 4模块提供了一组抽象基类,它们有点像Java接口。例如,作为collections.Sequence实例的任何类型都将支持索引。
- abstract baseclass reference(collections.MutableSequence对于list是正确的,但这里是主要的参考资料),对于其他正在阅读此答案并好奇的人:docs.python.org/library/…
- @是的,这是2中的链接
- @亚历克斯,你的建议在技术上是正确的,但通常不需要额外的工作。为什么不直接使用isinstance(x, list)?它是简单、标准的实践,并且被认为是良好的实践。另外,考虑到接口和ABC很可能会使初学者陷入困境。如果一个"更好"的解决方案难以始终如一地使用,那么它就不是最佳实践。
- @亚历克西斯·埃多克斯(Alexis EDOCX1)(5)被认为是不好的做法,至少在我的书中没有!如果您确定永远不会看到任何自定义对象,那就没问题了,但是执行isinstance(x, collections.MutableSequence)的难度有多大?
- 你的作者可能最了解,所以我不会为我的观点辩护。但我刚才在看[1],它只是建议在类中使用isinstance,或者更好地避免使用它。
- 忘记了链接:[1]:docs.python.org/faq/…
您要查找的表达式可能是:
1 2
| ...
return any( isinstance(e, list) for e in my_list ) |
测试:
1 2 3 4 5 6 7
| >>> my_list = [1,2]
>>> any( isinstance(e, list) for e in my_list )
False
>>> my_list = [1,2, [3,4,5]]
>>> any( isinstance(e, list) for e in my_list )
True
>>> |
。
- 可能值得强调的是,问题中名为list的变量将隐藏list类型,这意味着如果简单地粘贴,这里发布的大多数其他答案将失败。(我被那只咬了多少次真让人难堪。)
- +1用于使用any(),而不是一些for loop if组合。
也许,更直观的方法是这样的
1 2
| if type(e) is list:
print('Found a list element inside the list') |
。