Python 嵌套列表上的列表理解?
我有一个嵌套列表:Python 嵌套列表上的列表理解?,python,list,nested,list-comprehension,Python,List,Nested,List Comprehension,我有一个嵌套列表: 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']] 现在,我要做的是将列表中的每个元素转换为float
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']]
现在,我要做的是将列表中的每个元素转换为float。我的解决办法是:
newList = []
for x in l:
for y in x:
newList.append(float(y))
但这可以通过嵌套列表理解来实现吗
我所做的是:
[float(y) for y in x for x in l]
但结果是100个,加上2400个
如有任何解决方案,请解释。谢谢 下面是如何使用嵌套列表进行此操作:
>>> 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]
[deck.append((rank,suit)) for suit in suits for rank in ranks ]
这将为您提供一个列表列表,与您开始使用的列表类似,只是使用浮点数而不是字符串。如果您想要一个平面列表,那么您可以使用
[float(y)表示x中的x,l表示y中的x]
是的,您可以使用这样的代码:
l = [[float(y) for y in x] for x in l]
如果您不喜欢嵌套列表理解,也可以使用该函数
>>> from pprint import pprint
>>> 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']]
>>> pprint(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']]
>>> float_l = [map(float, nested_list) for nested_list in l]
>>> pprint(float_l)
[[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]]
在我看来,最好的方法是使用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]
不确定所需的输出是什么,但如果使用列表理解,则顺序遵循嵌套循环的顺序,而嵌套循环的顺序是向后的。所以我得到了我认为你想要的:
[float(y) for x in l for y in x]
其原理是:使用与嵌套for循环相同的顺序将其写出。这个问题可以在不使用for循环的情况下解决。单行代码就足够了。使用嵌套映射和lambda函数也可以在这里使用
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']]
map(lambda x:map(lambda y:float(y),x),l)
输出列表如下所示:
[[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]]
以下是如何将嵌套for循环转换为嵌套列表:
[[float(y) for y in x] for x in l]
[deck.append((rank,suit)) for suit in suits for rank in ranks ]
下面是嵌套列表理解的工作原理:
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]
就你的情况而言,应该是这样的
In [4]: new_list = [float(y) for x in l for y in x]
因为我来晚了一点,但我想分享列表理解的实际工作原理,尤其是嵌套列表理解:
New_list= [[float(y) for x in l]
[[float(y) for y in x] for x in l]
实际上与:
New_list=[]
for x in l:
New_list.append(x)
现在是嵌套列表理解:
New_list= [[float(y) for x in l]
[[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]]
我有一个类似的问题要解决,所以我遇到了这个问题。我对Andrew Clark和narayan的答案进行了性能比较,我想与大家分享一下 两个答案之间的主要区别在于它们在内部列表上的迭代方式。其中一个使用内置的,而另一个使用列表理解。所以在这个问题的上下文中,
map
应该比列表理解略好一些
让我们做一个性能基准测试,看看它是否真实。我使用python版本3.5.0来执行所有这些测试。在第一组测试中,我希望将每个列表的元素数保持在10个,并将列表数从10到100000不等
在下一组测试中,我想将每个列表的元素数提高到100
让我们勇敢地将列表中的元素数修改为1000
从这些测试中,我们可以得出结论,在这种情况下,map
比列表理解有性能优势。如果您试图强制转换为int
或str
,这也适用。对于每个列表元素较少的少量列表,差异可以忽略不计。对于每个列表包含更多元素的较大列表,您可能希望使用map
而不是列表理解,但这完全取决于应用程序的需要
然而,我个人认为列表理解比map
更具可读性和习惯性。它是python中事实上的标准。通常,人们在使用列表理解方面比map
更加熟练和舒适(特别是初学者)
deck = []
for rank in ranks:
for suit in suits:
deck.append(('%s%s')%(rank, suit))
这可以通过列表理解来实现:
[[float(y) for y in x] for x in l]
[deck.append((rank,suit)) for suit in suits for rank in ranks ]
是的,你可以做以下事情
[[float(y) for y in x] for x in l]
你也想把你的列表展平吗?@GregHewgill:OP没有回答,但根据他们接受的答案,他们似乎想保持嵌套的原样。
[float(y)表示y在x中表示x在l中表示x]
这将导致一系列的100,总计2400。你的代码生成的是映射对象,而不是列表:>float\u l=[map(float,nested\u list)对于l]
[[]、[]、[]、[]、[]、[]、[]、[]、[]、[]]中的嵌套_列表,但添加一个额外的调用以列出它的效果与预期一样:>>float_l=[list(map(float,nested_list)),对于l]
@pixelperfect,这是由于(错误信息…)更改python3
以返回无法理解的生成器。这应该是答案,因为有些时候我们不想将迭代器括起来。这可能不是正确的答案,因为它输出一个非嵌套列表,但这正是我要寻找的,特别是原则。谢谢这是不正确的:应该在[float(y)]
周围加上括号,lambdas是否比@Andrew Clark或Harry Binswanger的解决方案(更普通的列表理解)有任何性能优势?正如lambda看起来更难阅读一样。在几乎任何其他通用编程语言中,我们都会使用chainedmap
——正如您所展示的那样。但是看看它在python中有多丑陋——特别是考虑到上面的输出是不够的:它是一个生成器而不是一个列表。需要添加更多的样板list(list(..)
来完成图片。尝试fluentpy
和类似的库,在一定程度上摆脱这个陷阱。非常有用!明确循环(从上到下)在生成器中从左到右排列。这并不明显,因为在(f(x)表示l中的x)
中,for循环等价物的第二行放在了左侧。这似乎是我真正理解的一个解释,谢谢!作为一名python新手,来自Java,我花了几个小时努力理解嵌套理解,并搜索了多个地方。但是你让我度过了一个美好的夜晚。非常感谢@user48956是的,我认为将嵌套列表理解为一行代码不是很直观。这种用法将是一种反模式,这是一个很好且清晰的解释。谢谢这似乎根本没有解决上面的问题。请注意,作为答案发布的所有内容都必须是试图回答它发布到的问题。虽然此代码片段可能会解决问题,但确实有帮助