检查列表是否包含混合类型

时间:2016-01-04 14:25:48

标签: python

我尝试在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函数的混合数据类型的列表。

4 个答案:

答案 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