如何在列表列表中确定整数已包含多少个唯一的其他项?

时间:2016-06-03 16:41:09

标签: python algorithm

我有一个列表列表,其中包含整数,如下所示:

[[[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的方式呢?

2 个答案:

答案 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}