列表计数元素的Python列表

列表计数元素的Python列表,python,list,Python,List,您好,我正在尝试计算列表中的所有元素。 比如说 a = [[1,2],[3,4],[10,3,8]] 我想返回: 7 我试过数数和大小,但运气不好。 提前谢谢 a = [[1,2],[3,4],[10,3,8]] print(sum(map(len, a))) 输出 7 这可以写成生成器表达式,如下所示 print(sum(len(item) for item in a)) def get_size(current_item): if isinstance(current_it

您好,我正在尝试计算列表中的所有元素。 比如说

a = [[1,2],[3,4],[10,3,8]]
我想返回:

7
我试过数数和大小,但运气不好。 提前谢谢

a = [[1,2],[3,4],[10,3,8]]
print(sum(map(len, a)))
输出

7
这可以写成生成器表达式,如下所示

print(sum(len(item) for item in a))
def get_size(current_item):
    if isinstance(current_item, list):
        return sum(get_size(item) for item in current_item)
    else:
        return 1

a = [[1,2],[3,4],[10,3,8],[[1, 2, 3], [2, 3]]]
print get_size(a)    # 12
即使对于多级嵌套列表,最简单的方法也是这样

print(sum(len(item) for item in a))
def get_size(current_item):
    if isinstance(current_item, list):
        return sum(get_size(item) for item in current_item)
    else:
        return 1

a = [[1,2],[3,4],[10,3,8],[[1, 2, 3], [2, 3]]]
print get_size(a)    # 12
输出

7
这可以写成生成器表达式,如下所示

print(sum(len(item) for item in a))
def get_size(current_item):
    if isinstance(current_item, list):
        return sum(get_size(item) for item in current_item)
    else:
        return 1

a = [[1,2],[3,4],[10,3,8],[[1, 2, 3], [2, 3]]]
print get_size(a)    # 12
即使对于多级嵌套列表,最简单的方法也是这样

print(sum(len(item) for item in a))
def get_size(current_item):
    if isinstance(current_item, list):
        return sum(get_size(item) for item in current_item)
    else:
        return 1

a = [[1,2],[3,4],[10,3,8],[[1, 2, 3], [2, 3]]]
print get_size(a)    # 12

您可以对长度求和(如@thefourtheye建议的),也可以迭代所有元素,然后计数:

sum(len(b) for b in a)
sum(1 for b in a for c in b)

第一种方法显然更好,但第二种方法很好地展示了你可以通过列表理解来做的一些事情,并且还可以处理一个更一般的结构,即iterable of iterable(没有定义
\uu len\uuuu
)。

你可以对长度求和(如@thefourtheye建议的),或者迭代所有元素,和计数:

sum(len(b) for b in a)
sum(1 for b in a for c in b)

第一种方法显然更好,但第二种方法很好地展示了你可以通过列表理解来做的一些事情,并且还可以处理一个更一般的iterable结构(没有定义
\uu len\uuuu

出于学术目的,如果你的列表超过一个层次(例如
[[1,2,3],[4,5],[6,7,8]]]
,其中一个元素包含一个列表)您需要执行以下操作:

def count_elements(target):
    count = 0
    for element in target:
        if type(element) is list:
            count += count_elements(element)
        else:
            count += 1
    return count

但是OP所描述的问题更容易用其他答案解决。只需提到这些解决方案不容易扩展。

出于学术目的,如果您的列表超过一个级别(例如,
[[1,2,3],[4,5,[6,7,8]]]
,您的一个元素包含一个列表),您将需要执行以下操作:

def count_elements(target):
    count = 0
    for element in target:
        if type(element) is list:
            count += count_elements(element)
        else:
            count += 1
    return count
def myLen(L):
    if not L:
        return 0
    elif not isinstance(L[0], list):
        return 1 + myLen(L[1:])
    else:
        return myLen(L[0]) + myLen(L[1:])
但是OP所描述的问题更容易用其他答案中的一个来解决,只是提到这些解决方案不容易扩展

def myLen(L):
    if not L:
        return 0
    elif not isinstance(L[0], list):
        return 1 + myLen(L[1:])
    else:
        return myLen(L[0]) + myLen(L[1:])
输出:

>>> myLen([[1,2],[3,4],[10,3,8]])
7
输出:

>>> myLen([[1,2],[3,4],[10,3,8]])
7

您可以展平该列表,然后在展平的列表上使用
len()

a=[[1,2],[3,4],[10,3,8]]

展平_a=[子列表中的项对应子列表中的项]


len(展平的)

您可以展平该列表,然后在展平的列表上使用
len()

a=[[1,2],[3,4],[10,3,8]]

展平_a=[子列表中的项对应子列表中的项]


len(扁平的_a)

请注意,如果您的列表有多个层次,这将不起作用。在这种情况下,您需要使用递归解决方案。@adsmith同意,但OP说,只要
列表列表
事实上,因为提问者想计算列表列表中的元素,那么在列表的任意层次上递归都会给出错误的答案列表更深层的情况。问题是您希望
[[1,2]]
的答案是1(列表中的元素数:这一个元素恰好是列表)还是2(嵌套列表中任何级别的元素数)@SteveJessop是的,但根据我的经验,人们通常会过度简化他们的问题,以创建一个简短完整的示例,因此我想写一封便条,以防OP回来时说“不,这给了我错误的结果”当他把它应用到他的300个元素的列表中时,@thefourthey谢谢你的更新。我为得到了一个我基本上只是“猜测”的正确答案感到难过另外,你的递归比我的要漂亮得多:)请注意,如果你的列表有多个层次,这将不起作用。在这种情况下,你需要使用递归解决方案。@adsmith同意,但OP说,事实上,只需
列表
,因为提问者想要计算列表中的元素,然后通过任意数量的级别进行递归如果列表的级别更深,ls of list会给出错误的答案。问题是您希望
[[1,2]]]
的答案是1(列表中的元素数:这一个元素恰好是列表)还是2(嵌套列表中任何级别的元素数)@SteveJessop是的,但根据我的经验,人们通常会过度简化他们的问题,以创建一个简短完整的示例,因此我想写一封便条,以防OP回来时说“不,这给了我错误的结果”当他把它应用到他的300个元素的列表中时,@thefourthey谢谢你的更新。我为得到了一个我基本上只是“猜测”的正确答案感到难过加上你的递归比我的要漂亮得多:)对于iterable中的iterable,你可能想用类似于
def mylen(iterable)的东西来代替
len
:try:return len(iterable),除了TypeError:return sum(iterable中x的1)
。也就是说,在可能的情况下,对iterables执行快速操作,否则执行缓慢操作。对于iterables中的iterables,您可能希望用类似于
def mylen(iterable)的内容替换
len
:try:return len(iterable),但TypeError除外:return sum(iterable中的x为1)
。也就是说,在可能的情况下,对iterables执行快速操作,否则执行慢速操作。对于多层深度
len(str(a).strip('[],')).split('[],'))
编辑我在这里尝试过:对于您的列表:对于多层深度
len(str(a).strip('[],').split(','))
编辑我在这里尝试过:对于您的列表: