查找列表,其中包含列表python中0-23的所有值

时间:2015-12-16 09:50:24

标签: python list

我有一份清单清单。这些列表中的列表如下所示:

[0,2,5,8,7,12,16,18], [0,9,18,23,5,8,15,16], [1,3,4,17,19,6,13,23],
[9,22,21,10,11,20,14,15], [2,8,23,0,7,16,9,15], [0,5,8,7,9,11,20,16]

每个小列表都有0到0的8个值,​​并且小列表中没有值重复。

我现在需要的是存储值为0-23的三个列表。有可能有几种组合来实现它,但我只需要一种。

在这种特殊情况下,输出为:

[0,2,5,8,7,12,16,18], [1,3,4,17,19,6,13,23], [9,22,21,10,11,20,14,15]

我想要对订单做点什么,但我不是python pro,所以我很难处理列表中的所有列表(比较所有列表)。

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

以下似乎有效:

from itertools import combinations, chain

lol = [[0,2,5,8,7,12,16,18], [0,9,18,23,5,8,15,16], [1,3,4,17,19,6,13,23], [9,22,21,10,11,20,14,15], [2,8,23,0,7,16,9,15], [0,5,8,7,9,11,20,16]]

for p in combinations(lol, 3):
    if len(set((list(chain.from_iterable(p))))) == 24:
        print p
        break     # if only one is required

显示以下内容:

([0, 2, 5, 8, 7, 12, 16, 18], [1, 3, 4, 17, 19, 6, 13, 23], [9, 22, 21, 10, 11, 20, 14, 15])

答案 1 :(得分:3)

如果总是发生3个列表将形成0-23之间的数字,并且您只想要第一个列表,那么这可以通过创建长度为3的组合来完成,然后设置交集:

>>> li = [[0,2,5,8,7,12,16,18], [0,9,18,23,5,8,15,16], [1,3,4,17,19,6,13,23], [9,22,21,10,11,20,14,15], [2,8,23,0,7,16,9,15], [0,5,8,7,9,11,20,16]]

>>> import itertools
>>> for t in itertools.combinations(li, 3):
...     if not set(t[0]) & set(t[1]) and not set(t[0]) & set(t[2]) and not set(t[1]) & set(t[2]):
...         print t
...         break
([0, 2, 5, 8, 7, 12, 16, 18], [1, 3, 4, 17, 19, 6, 13, 23], [9, 22, 21, 10, 11, 20, 14, 15])

答案 2 :(得分:0)

让我们做一个递归的解决方案。

我们需要一个包含这些值的列表列表:

target_set = set(range(24))

这是一个递归尝试查找与该集完全匹配的列表列表的函数:

def find_covering_lists(target_set, list_of_lists):
    if not target_set:
        # Done
        return []

    if not list_of_lists:
        # Failed
        raise ValueError()

    # Two cases -- either the first element works, or it doesn't
    try:
        first_as_set = set(list_of_lists[0])
        if first_as_set <= target_set:
            # If it's a subset, call this recursively for the rest
            return [list_of_lists[0]] + find_covering_lists(
                target_set - first_as_set, list_of_lists[1:])
    except ValueError:
        pass  # The recursive call failed to find a solution

    # If we get here, the first element failed.
    return find_covering_lists(target_set, list_of_lists[1:])