在嵌套列表上列出理解?

Boy*_*smo 194 python nested list-comprehension list

我有这个嵌套列表:

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']]
Run Code Online (Sandbox Code Playgroud)

现在,我想要做的是将列表中的每个元素转换为float.我的解决方案是:

newList = []
for x in l:
  for y in x:
    newList.append(float(y))
Run Code Online (Sandbox Code Playgroud)

但这可以使用嵌套列表理解来完成,对吗?

我所做的是:

[float(y) for y in x for x in l]
Run Code Online (Sandbox Code Playgroud)

但结果是一堆100的总和2400.

任何解决方案,将非常感谢解释.谢谢!

And*_*ark 287

以下是使用嵌套列表理解的方法:

[[float(y) for y in x] for x in l]
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个列表列表,类似于您开始使用的列表,除了浮点数而不是字符串.如果你想要一个平面列表,那么你会使用[float(y) for x in l for y in x].


Rah*_*hul 150

以下是如何将嵌套for循环转换为嵌套列表解析:

在此输入图像描述

以下是嵌套列表理解的工作原理:

            l a b c d e f
            ? ? ? ? ? ? ?
In [1]: l = [ [ [ [ [ [ 1 ] ] ] ] ] ]
In [2]: for a in l:
   ...:     for b in a:
   ...:         for c in b:
   ...:             for d in c:
   ...:                 for e in d:
   ...:                     for f in e:
   ...:                         print(float(f))
   ...:                         
1.0

In [3]: [float(f)
         for a in l
   ...:     for b in a
   ...:         for c in b
   ...:             for d in c
   ...:                 for e in d
   ...:                     for f in e]
Out[3]: [1.0]

#Which can be written in single line as
In [4]: [float(f) for a in l for b in a for c in b for d in c for e in d for f in e]
Out[4]: [1.0]
Run Code Online (Sandbox Code Playgroud)

  • 超级有用!清楚地表明循环(从上到下)在生成器中从左到右排序.这一点并不明显,因为在`((f(x)for x in l)`中,将for-loop等价物的第二行放在左边. (15认同)
  • 这似乎是最能打动我的解释,谢谢! (3认同)
  • 作为一个来自 Java 的 Python 新手,我花了几个小时努力理解嵌套理解并搜索了多个地方。但你让我度过了一个美好的夜晚。万分感谢!!! (3认同)

fal*_*tru 47

>>> 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]
Run Code Online (Sandbox Code Playgroud)


小智 35

不确定你想要的输出是什么,但是如果你正在使用列表理解,那么顺序遵循嵌套循环的顺序,你已经倒退了.所以我得到了我认为你想要的东西:

[float(y) for x in l for y in x]
Run Code Online (Sandbox Code Playgroud)

原则是:使用您在编写嵌套for循环时使用的相同顺序.

  • 这可能不是正确的答案,因为它输出一个非嵌套列表,但它是我一直在寻找的,特别是*原则*。谢谢! (2认同)
  • 这是不正确的:应该在“[float(y)]”周围有括号 (2认同)

Aad*_*Ura 7

由于我在这里有点晚了,但我想分享列表理解实际上是如何工作的,尤其是嵌套列表理解:

New_list= [[float(y) for x in l]
Run Code Online (Sandbox Code Playgroud)

实际上是一样的:

New_list=[]
for x in l:
    New_list.append(x)
Run Code Online (Sandbox Code Playgroud)

现在嵌套列表理解:

[[float(y) for y in x] for x in l]
Run Code Online (Sandbox Code Playgroud)

是一样的;

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)
Run Code Online (Sandbox Code Playgroud)

输出:

[[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]]
Run Code Online (Sandbox Code Playgroud)


Soh*_*oqi 7

我有一个类似的问题要解决,所以我遇到了这个问题。我对 Andrew Clark 和 narayan 的回答进行了性能比较,我想分享一下。

两个答案之间的主要区别在于它们如何迭代内部列表。其中一个使用内置map,而另一个使用列表理解。如果 Map 函数不需要使用 lambdas ,那么它对其等效的列表理解具有轻微的性能优势。所以在这个问题的上下文中map应该比列表理解略好。

让我们做一个性能基准测试,看看它是否真的是真的。我使用 python 版本 3.5.0 来执行所有这些测试。在第一组测试中,我想将每个列表的元素保持为10,并将列表数量从10-100,000 不等

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*10]"
>>> 100000 loops, best of 3: 15.2 usec per loop   
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*10]"
>>> 10000 loops, best of 3: 19.6 usec per loop 

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*100]"
>>> 100000 loops, best of 3: 15.2 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*100]"
>>> 10000 loops, best of 3: 19.6 usec per loop 

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*1000]"
>>> 1000 loops, best of 3: 1.43 msec per loop   
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*1000]"
>>> 100 loops, best of 3: 1.91 msec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*10000]"
>>> 100 loops, best of 3: 13.6 msec per loop   
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*10000]"
>>> 10 loops, best of 3: 19.1 msec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*100000]"
>>> 10 loops, best of 3: 164 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*100000]"
>>> 10 loops, best of 3: 216 msec per loop
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在下一组测试中,我想将每个列表的元素数提高到100

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*10]"
>>> 10000 loops, best of 3: 110 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*10]"
>>> 10000 loops, best of 3: 151 usec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*100]"
>>> 1000 loops, best of 3: 1.11 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*100]"
>>> 1000 loops, best of 3: 1.5 msec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*1000]"
>>> 100 loops, best of 3: 11.2 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*1000]"
>>> 100 loops, best of 3: 16.7 msec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*10000]"
>>> 10 loops, best of 3: 134 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*10000]"
>>> 10 loops, best of 3: 171 msec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*100000]"
>>> 10 loops, best of 3: 1.32 sec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*100000]"
>>> 10 loops, best of 3: 1.7 sec per loop
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

让我们勇敢地将列表中的元素数量修改为1000

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*10]"
>>> 1000 loops, best of 3: 800 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*10]"
>>> 1000 loops, best of 3: 1.16 msec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*100]"
>>> 100 loops, best of 3: 8.26 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*100]"
>>> 100 loops, best of 3: 11.7 msec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*1000]"
>>> 10 loops, best of 3: 83.8 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*1000]"
>>> 10 loops, best of 3: 118 msec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*10000]"
>>> 10 loops, best of 3: 868 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*10000]"
>>> 10 loops, best of 3: 1.23 sec per loop

>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*100000]"
>>> 10 loops, best of 3: 9.2 sec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*100000]"
>>> 10 loops, best of 3: 12.7 sec per loop
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

从这些测试中我们可以得出结论,map在这种情况下,它比列表理解具有性能优势。如果您尝试强制转换为int或 ,这也适用str。对于每个列表元素较少的少量列表,差异可以忽略不计。对于每个列表具有更多元素的较大列表,人们可能更喜欢使用map列表理解,但这完全取决于应用程序的需求。

但是,我个人认为列表理解比map. 它是 Python 中的事实上的标准。通常人们在使用列表理解方面比map.