我有一个列表列表,其中包含整数,如下所示:
[[[1, 2, 3], [4, 5, 6, 7]], [[3, 7, 5], [1, 2, 4, 6]]]
给定整数1,我想要一些方法来创建一个将返回
的函数[2, 3, 4, 6]
我目前的方法是:
bigList = [[[1, 2, 3], [4, 5, 6, 7]], [[3, 7, 5], [1, 2, 4, 6]]]
hasBeenWith = []
integer = 1
for medList in bigList:
for smallList in medList:
if integer in smallList:
hasBeenWith = hasBeenWith + list(set(smallList) - set(hasBeenWith))
我知道这是一个天真的算法。什么是更好,更pythonic的方式呢?
答案 0 :(得分:4)
>>> set(integer for medList in bigList for smallList in medList for integer in smallList if 1 in smallList)
{1, 2, 3, 4, 6}
您可以使用集合理解来遍历所有列表,并选择包含1的列表元素。请注意for
循环的顺序与代码中的顺序相同,它们只是全部在一行。
>>> set(integer for medList in bigList for smallList in medList for integer in smallList if 1 in smallList and integer != 1)
{2, 3, 4, 6}
然后,您希望从结果中排除1
。
>>> list(set(integer for medList in bigList for smallList in medList for integer in smallList if 1 in smallList and integer != 1))
[2, 3, 4, 6]
如果您希望将结果作为列表,请在结尾处将其转换为一个。使用集合并在最后切换到列表比将中间结果存储为列表更有效。
顺便说一下,这里的数字按顺序出现了,但这并不能保证会发生。集合没有排序,所以它们的排序只是巧合。如果您想按顺序添加,请添加对sorted()
的调用。
答案 1 :(得分:2)
这有点短,而且还很可读。既然你只关心底层列表,那么如果你有一个将嵌套列表结构扁平化为单个可迭代列表的函数(基本上是所有chain
&),它将更具可读性。列表推导正在进行中。然后你可以只使用一个列表推导来迭代展平的结构。
from itertools import chain
num = 1
biglist = [[[1, 2, 3], [4, 5, 6, 7]], [[3, 7, 5], [1, 2, 4, 6]]]
been_with = set(chain(*[x for x in chain(*biglist) if num in x])) - {num}