我尝试在Python中编写一个函数,它将检查列表是否包含混合对象类型(例如,包含列表和字符串的列表)。我可以管理一次检查列表,但不能检查子列表
如果列表包含仅列表或仅字符串,则该函数应返回True。
例如:
[["aa", "bb", "cc"], ["aa"], [ ]]
- 将返回True
[["aa", "bb"], [["aa", "bb"], "aa"]]
- 返回False
(包含列表和字符串的列表)
检查一次列表:
def same_type(lst):
# an empty list would return True
if len(lst) == 0:
return True
elif len(lst) == 1:
return True
else:
for l in lst :
# check if other elements are the same as first
if type(lst[0]) != type(l):
return False
return True
修改
我最终这样做了:
1)使用递归查找给定列表中的所有列表(子列表)并将它们放在一个大列表中
2)迭代该大列表并检查是否存在具有same_type
函数的混合数据类型的列表。
答案 0 :(得分:1)
我假设列表被视为特殊情况,并且需要递归检查它们的内容;其他迭代器(如元组,甚至字符串)不会被这样对待。
首先,递归查找第一个非列表元素的函数(如果没有任何内容,则引发ValueError):
def find_first_element(L):
if not L:
raise ValueError("list is empty")
item = L[0]
if type(item) == list:
try:
return find_first_element(item)
except ValueError:
# That sublist was empty, maybe the rest of the list
# contains something...
return find_first_element(L[1:])
else:
return item
然后是一个递归函数,检查列表中的所有项目是否与第一个项目具有相同的类型:
def all_same_type(L):
try:
first_item = first_find_element(L)
except ValueError:
# Nothing in there, so all the same
return True
return all_of_type(L, type(first_item))
def all_of_type(L, first_item_type):
for item in L:
if type(item) == list:
# Recurse
if not all_of_type(item, first_item_type):
return False
elif type(item) != first_item_type:
return False
# We saw all and didn't return False, so return True.
return True
答案 1 :(得分:0)
您可以通过以下功能首先展平您的列表:
def flatten(lst):
outp = []
for elem in lst:
if isinstance(elem, list):
outp += flatten(elem)
else:
outp.append(elem)
return outp
但是,请记住,只要它按照您希望的方式执行操作,就可以将对象的类型视为非单调形式。 (查看鸭子打字。)
答案 2 :(得分:0)
您可以尝试使用以下递归函数来检查列表lst
中的所有元素是typ
类型还是满足相同属性的列表。
def all_type_eq(lst, typ):
# an empty list would return True
if len(lst) == 0:
return True
elif len(lst) == 1:
return True
else:
for l in lst :
# check if other elements are the same as first
if type(l) == list:
if not all_type_eq(l, typ):
return False
elif typ != type(l):
return False
return True
答案 3 :(得分:0)
您似乎需要做的是在检查之前弄平您的清单:
def flatten(lst):
for e in lst:
if type(e) == lst:
for ee in flatten(e):
yield ee
else:
yield e
然后,您只需检查是否存在类型不匹配:
def mixed_types(lst):
t0 = None
for e in flatten(lst):
if t0 is None:
t0 = type(e)
elif type(e) != t0:
return False
return True