列表理解与某种循环相互依赖?

时间:2016-02-23 00:51:11

标签: python list dictionary

我确信有很多关于列表推导的问题,但我有一个关于一个非常特殊的案例涉及嵌套循环和共同引用,我无法在其他地方找到答案。

假设您有一个满足两个约束的字典:(1)字典中的每个值都是一个任意长度的列表;(2)字典外面有一些列表,其元素是字典中键的子集(由于超出本问题范围的原因,这是必要的。)

知道了吗?它看起来有点像这样:

someDict = {'a':[0, 1], 'b':[2, 3], 'c':[4, 5], 'd':[6, 7], 'e':[8, 9]}
supraList = ['b', 'c', 'd']

现在我想做的是:

1)循环 someDict的那些列表,其键也是supraList的元素;

2)将someDict列表的元素(不是列表本身)添加到一些新的超列表中。

效果是这样的:

... CODE ...
newSupraList = [2, 3, 4, 5, 6, 7]

即。 supraList包含' b',' c'和' d',因此newSupraList获取与' b',' c'相关联的列表的组合元素。并且' d'在someDict。

通过循环实现这一点有点像:

newSupraList = []
for i in supraList:
    for j in someDict[i]:
        newSupraList.append(j)

这可以通过理解来实现吗?我能写的最好的理解(而且很难看)出现了:

newSupraList = [[2, 3], [4, 5], [6, 7]]

我确信有一种非常简单的方法可以迭代这样的列表,尽管如此,尽管如此,但是我认为我会有一些新的眼光来一些新角度的问题。循环可能更好的可读性,但我觉得它在任何情况下都很有趣!

2 个答案:

答案 0 :(得分:5)

当然,你也可以在理解中有两个for循环。

>>> [x for y in supraList for x in someDict[y]]
[2, 3, 4, 5, 6, 7]

或者,您可以使用chain中的itertools

解压缩:

>>> from itertools import chain
>>> list(chain(*(someDict[x] for x in supraList)))
[2, 3, 4, 5, 6, 7]

使用chain.from_iterable

>>> list(chain.from_iterable(someDict[x] for x in supraList))
[2, 3, 4, 5, 6, 7]

答案 1 :(得分:4)

是的,先生:

newSupraList = [item for key in supraList for item in someDict[key]]