【问题标题】:How to put into list comprehension two for loops?如何将两个 for 循环放入列表理解?
【发布时间】:2019-02-05 02:42:55
【问题描述】:
我正在寻找如何将两个 for 循环放入列表理解的答案,其中一个 for 循环嵌入到第二个中。在这个例子中是否也可以避免使用 for 循环?此示例的目标应该是将值从嵌入到另一个列表中的列表中提取到一个列表中。
slov = {"abc":[1.0, 2.0], "b": [3.0], "a12": [6.0]}
li = list(slov.keys())
hod = [i for i in li if len(i)==3]
slo = []
for k in hod:
j = slov[k]
for l in j:
slo.append(l)
提前谢谢你。
【问题讨论】:
标签:
python
list
for-loop
list-comprehension
【解决方案1】:
使用 for 循环使您的代码更具可读性和直接性,但是如果您坚持使用单行列表理解,则它是:
slov = {"abc":[1.0, 2.0], "b": [3.0], "a12": [6.0]}
slo = [l for k in (i for i in slov.keys() if len(i)==3) for l in slov[k]]
print(slo)
输出:
[1.0, 2.0, 6.0]
【解决方案2】:
另外几个嵌套选项。
首先用匹配条件的键构建一个新的字典:
[ item for values in { k: v for k, v in slov.items() if len(k) == 3 }.values() for item in values ]
或者使用其键与条件匹配的值构建一个列表:
[ item for values in [ v for k, v in slov.items() if len(k) == 3 ] for item in values ]
这部分[ v for k, v in slov.items() if len(k) == 3 ] 以嵌套列表[[1.0, 2.0], [6.0]] 的形式返回结果,因此需要将其展平嵌套在列表推导中。
都返回#=> [1.0, 2.0, 6.0]
【解决方案3】:
您可以使用itertools.chain 来展平长度为 3 的键的值列表:
from itertools import chain
slov = {"abc":[1.0, 2.0], "b": [3.0], "a12": [6.0]}
slo = list(chain.from_iterable(slov[k] for k in slov if len(k) == 3))
print(slo)
# [1.0, 2.0, 6.0]
【解决方案4】:
我可以看到上面已经给出了一些答案。您将在下面找到一个稍作修改的版本。
slov = {"abc":[1.0, 2.0], "b": [3.0], "a12": [6.0]}
print ([j for k, i in slov.items() if len(k) == 3 for j in i]) # Outer Loop (for k, i in slov.items() if len(k) == 3), Inner Loop (for j in i)
# Output - [1.0, 2.0, 6.0]
我希望这很重要... :)