Skip to main content
 首页 » 编程设计

python之如何在保留结构的同时遍历列表列表

2025年05月04日17dflying

我正在尝试创建一个简单的函数来重新格式化列表中的项目然后打印它们

这对于列表来说已经足够简单了:

my_list = [1/3,7/11,2/5] #generate list of floats 
formatted_list = ['%.2f' % elem for elem in my_list] #format to 2 d.p 
print(formatted_list) #print re-formatted list 

但我有一个嵌套列表列表。要循环遍历其中的每一项,我需要执行类似 this answer 中的操作.然后让我写说

my_list = [(1/3,1/4,1/5), (2/3,2/4,2/5), 3/3] 
formatted_list = ['%.2f' % elem for elem in traverse(my_list)] #loop over unpacked list 

然而,这样做的主要缺点是它不再保留结构(列表中的元组)。

即:

print(formatted_list) 

返回

0.33, 0.25, 0.2, 0.66, 0.5, 0.4, 1.0 
#I want (0.33, 0.25, 0.2), (0.66, 0.5, 0.4), 1.0 

是否有一种方法可以重新格式化或更普遍地迭代任意深度嵌套列表中的项目,以返回与原始结构相同的列表?

请您参考如下方法:

这个支持列表/元组/浮点集的任意嵌套。

def myformat(x): 
    return '%.2f' % x if isinstance(x, float) else type(x)(map(myformat, x)) 

演示:

>>> myformat([(1/3, 1/4), [2/3, (2/4, {2/5})], 3/3]) 
[('0.33', '0.25'), ['0.67', ('0.50', {'0.40'})], '1.00'] 

也适用于其他类型数字的替代实现:

def myformat(x): 
    try: 
        return type(x)(map(myformat, x)) 
    except: 
        return '%.2f' % x 

或者,原始版本可以使用 isinstance(x, numbers.Number)。