Mis*_*a S -4 python string file list python-3.x
假设我有一个这样的列表(L1):
L1 = [['1', '0', '0', '0'], ['1', '0', '0', '0'], ['0', '0', '0', '1'], ['1', '0', '0', '0'], ['0', '0', '0', '1'], ['0', '0', '1', '0'], ['1', '0', '0', '0'], ['1', '0', '0', '0'], ['0', '0', '0', '1'], ['0', '0', '0', '1'], ['0', '0', '0', '1'], ['1', '0', '0', '0'], ['0', '0', '0', '1'], ['0', '0', '0', '1'], ['0', '0', '0', '1'], ['1', '0', '0', '0'], ['1', '0', '0', '0'],['0', '0', '0', '0']]
Run Code Online (Sandbox Code Playgroud)
如果我使用len(L1),则返回18,这是给定输入的列表总数.
如果我需要计算输入列表的令牌总数怎么办?怎么做到这一点?因为每个列表都有4由comma分隔符分隔的标记.那么这个列表总共有72令牌?
在Python 3中是否有任何方法可以实现这一点?任何帮助深表感谢!
对于您的简单示例,只需对嵌套列表的长度求和:
sum(map(len, L1))
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为你拥有的是一个单一的嵌套级别; 外部列表只包含嵌套列表,每个列表只包含字符串.sum()用map()是非常快的得到的总长度的方法; 一切都是用C代码处理的,Python评估循环不必for在这里循环.
如果你知道内部列表每个只包含4个元素,你也可以只计算总数:
len(L1) * 4
Run Code Online (Sandbox Code Playgroud)
这更快; 根本不需要迭代来请求每个嵌套列表对象的长度.但是,我们在这里讨论的是.76 vs .07微秒,在任何Python程序中都不是问题.Frame发布的for循环方法大约需要两倍,即1.33微秒.不完全是永恒的.
如果您的输入不是常规的(因此混合不同嵌套级别的列表),但是只包含对象列表,您需要迭代并决定每个元素要做什么.这是一个基于堆栈的函数,它将计算这种结构中的所有非列表元素:
def total_length(irregular):
total = 0
stack = [irregular]
while stack:
ob = stack.pop()
if not isinstance(ob, list):
total += 1
else:
stack.extend(ob)
return total
Run Code Online (Sandbox Code Playgroud)
通过isinstance()根据需要添加测试,上述内容可以扩展到覆盖元组等.
演示:
>>> L1 = [['1', '0', '0', '0'], ['1', '0', '0', '0'], ['0', '0', '0', '1'], ['1', '0', '0', '0'], ['0', '0', '0', '1'], ['0', '0', '1', '0'], ['1', '0', '0', '0'], ['1', '0', '0', '0'], ['0', '0', '0', '1'], ['0', '0', '0', '1'], ['0', '0', '0', '1'], ['1', '0', '0', '0'], ['0', '0', '0', '1'], ['0', '0', '0', '1'], ['0', '0', '0', '1'], ['1', '0', '0', '0'], ['1', '0', '0', '0'], ['0', '0', '0', '0']]
>>> sum(map(len, L1))
72
>>> irregular = ['foo', ['spam', 'ham'], ['bar', ['monty', 'python', ['eric', 'idle'], 'vikings'], 42]]
>>> total_length(irregular)
10
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |