【发布时间】:2020-08-26 09:38:03
【问题描述】:
鉴于以下列表,
a = [[1,2,3],1,[1,2,43,5],[1,23,4,4],6.5,[1,1,2,45]]
我想了解它的所有元素。如您所见,当子集只有一个元素时,我没有 1 的列表,而只有元素。所以这当然行不通,因为a 的第二个元素是不可迭代的,
for x in a:
for i in x:
print(i)
#do much more
错误:
for i in x:
TypeError: 'int' object is not iterable
我可以做以下,但是我觉得很不方便,因为我必须复制代码,或者在'#do much more部分调用一个函数。有什么想法吗?
for x in a:
if type(x) is list:
for i in x:
print(i)
#do much more
else:
print(x)
#do much more (the same as above)
【问题讨论】:
-
“我觉得它不方便”——这就是为什么不要在数据结构中组合类型通常是个好主意。大多数语言都禁止它,仅仅因为 Python 允许它并不能使它成为问题的最佳解决方案。你想用这个数据结构实现什么?推荐阅读:xy problem。例如,如果你把你的数字做成单元素列表,那么检查类型的问题就从本质上解决了。
-
您实际上可以暂时将其转换为
str并工作并将其转换回来吗?b = [str(i) for i in a]。希望它不包括任何数学,正如您在上面的 Q 中提到的那样,您需要它 -
@ggorlen 这只是一个小例子。我正在阅读巨大的
json文件,其结构使得在层次结构的某个点我有元素列表或单独一个元素(不在长度为 1 的列表中)。 -
好吧,如果你采用这种方法,我想你会发现无论你想在哪里有意义地使用数据(不清楚你所做的只是打印,还是这是基础一些大型应用程序或什么),您将需要编写条件来确定您手头的类型,然后再对其进行操作。你的整个代码库可能会被这样的重复类型检查弄得一团糟,所以我建议重新评估这个数据结构是否是你真正想要使用的。回答者只是向您展示了处理相同基本设计缺陷的各种方法。
-
@ggorlen 事实上,我不只是打印,这就是为什么我写了做更多的事情,我想保持这个想法简单,同时说明我做的不仅仅是打印。总的来说,我同意你的看法,这不是一个好习惯,但现在我只需要稍作修改即可完成此操作。我也同意大多数答案只是一种解决方法,实际上很多只是我一开始就有的解决方案,但是看看 M. Abreu 的,这看起来很通用。