从符合特定条件的列表中删除子列表

时间:2018-03-21 18:04:30

标签: python

我使用itertools.product()创建所有三元素排列而不进行镜像:

import itertools

list_1 = [list(i) for i in itertools.product(tuple(range(4)), repeat=3) if tuple(reversed(i)) >= tuple(i)]

输出:

[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 1, 0], [0, 1, 1], [0, 1, 2], [0, 1, 3], [0, 2, 0], [0, 2, 1], [0, 2, 2], [0, 2, 3], [0, 3, 0], [0, 3, 1], [0, 3, 2], [0, 3, 3], [1, 0, 1], [1, 0, 2], [1, 0, 3], [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 3, 1], [1, 3, 2], [1, 3, 3], [2, 0, 2], [2, 0, 3], [2, 1, 2], [2, 1, 3], [2, 2, 2], [2, 2, 3], [2, 3, 2], [2, 3, 3], [3, 0, 3], [3, 1, 3], [3, 2, 3], [3, 3, 3]]

如何从列表list_1中删除这些子列表,这些子列表具有相同数量的相应值,然后只留下其中一个?

例如,在子列表[1,1,2], [1,2,1]中,给定值的数量完全相同,即每个子列表中有两个1和一个2,即&# 39;为什么我认为子列表是相同的,这就是为什么我只想留下第一个,即[1,1,2]。怎么办呢?

我正在考虑计算每个子列表中相应值的数量,并创建一个列表,其中包含有关给定值的数量的发生特征,然后检查循环中列表list_1中的每个元素或带有给定的功能以前没有发生过。但在我看来,这很复杂。

3 个答案:

答案 0 :(得分:5)

使用combinations_with_replacement,而不是使用product模块中的itertools。这样就可以在一行中完成你想做的事情而不需要任何按摩:

list1 = [list(i) for i in combinations_with_replacement(range(4),3)]

之后print(list1)的结果是

[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 1, 1], [0, 1, 2], [0, 1, 3], [0, 2, 2], [0, 2, 3], [0, 3, 3], [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 2, 3], [1, 3, 3], [2, 2, 2], [2, 2, 3], [2, 3, 3], [3, 3, 3]]

请注意,您无需将range对象转换为元组。

答案 1 :(得分:1)

您可以对每个子列表进行排序,然后按如下方式提取唯一的子列表。

list_2 = map(sorted, list_1)
list_u = []
[list_u.append(x) for x in list_2 if x not in list_u]

输出:

list_u = [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 1, 1], [0, 1, 2], [0, 1, 3], [0, 2, 2], [0, 2, 3], [0, 3, 3], [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 2, 3], [1, 3, 3], [2, 2, 2], [2, 2, 3], [2, 3, 3], [3, 3, 3]]

现在,除了对每个子列表进行排序之外,还有更高效的选项,但我会将其留给您。

答案 2 :(得分:1)

这可能会起到作用:

import itertools

def uniqifyList(list):
    indexToReturn = []
    sortedUniqueItems = []

    for idx, value in enumerate(list):
        # check if exists in unique_list or not
        value.sort()
        if value not in sortedUniqueItems:
            sortedUniqueItems.append(value)
            indexToReturn.append(idx)

    return [list[i] for i in indexToReturn]

list1 = [list(i) for i in itertools.product(tuple(range(4)), repeat=3) if tuple(reversed(i)) >= tuple(i)]
print(list1)

list2 = uniqifyList(list1)
print(list2)

哪个输出:

[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 1, 1], [0, 1, 2], [0, 1, 3], [0, 2, 2], [0, 2, 3], [0, 3, 3], [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 2, 3], [1, 3, 3], [2, 2, 2], [2, 2, 3], [2, 3, 3], [3, 3, 3]]