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

时间:2017-10-28 16:02:36

标签: python python-3.x list

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

对于列表来说这很简单:

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

有没有办法重新格式化,或者更常见的是迭代任意深度嵌套列表中的项目,以返回与原始列表结构相同的列表?

2 个答案:

答案 0 :(得分:5)

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

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)

答案 1 :(得分:1)

也许是嵌套的理解帮助,即

formatted =  [tuple(['%.2f' % j for j in elem]) if isinstance(elem,tuple) else '%.2f' % elem for elem in my_list ]