我有这样一个嵌套列表:

l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]

我想把l中的每个元素都转换为float。我有这样的代码:

newList = []
for x in l:
    for y in x:
        newList.append(float(y))

如何用嵌套的列表理解来解决这个问题?


另请参阅:如何从列表理解而不是嵌套列表中获得平坦的结果?


当前回答

我想分享一下列表推导式实际上是如何工作的,特别是对于嵌套的列表推导式:

new_list= [float(x) for x in l]

其实和:

new_list=[]
for x in l:
    new_list.append(float(x))

现在对于嵌套列表的理解:

[[float(y) for y in x] for x in l]

等于:

new_list=[]
for x in l:
    sub_list=[]
    for y in x:
        sub_list.append(float(y))

    new_list.append(sub_list)

print(new_list)

输出:

[[40.0, 20.0, 10.0, 30.0], [20.0, 20.0, 20.0, 20.0, 20.0, 30.0, 20.0], [30.0, 20.0, 30.0, 50.0, 10.0, 30.0, 20.0, 20.0, 20.0], [100.0, 100.0], [100.0, 100.0, 100.0, 100.0, 100.0], [100.0, 100.0, 100.0, 100.0]]

其他回答

不确定您想要的输出是什么,但如果您使用的是列表推导式,则顺序遵循嵌套循环的顺序,这是向后的。我拿到了你想要的东西

[float(y) for x in l for y in x]

其原则是:使用与编写嵌套for循环相同的顺序。

是的,你可以这样做。

[[float(y) for y in x] for x in l]
>>> l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]
>>> new_list = [float(x) for xs in l for x in xs]
>>> new_list
[40.0, 20.0, 10.0, 30.0, 20.0, 20.0, 20.0, 20.0, 20.0, 30.0, 20.0, 30.0, 20.0, 30.0, 50.0, 10.0, 30.0, 20.0, 20.0, 20.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0]

下面是如何使用嵌套的列表理解来做到这一点:

[[float(y) for y in x] for x in l]

这将给你一个列表的列表,类似于你开始的,只是用浮点数而不是字符串。

如果你想要一个平面列表,那么你可以使用

[float(y) for x in l for y in x]

注意这个循环顺序,l中的x在这个循环中排在前面。

在我看来,最好的方法是使用python的itertools包。

>>>import itertools
>>>l1 = [1,2,3]
>>>l2 = [10,20,30]
>>>[l*2 for l in itertools.chain(*[l1,l2])]
[2, 4, 6, 20, 40, 60]