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

Tom*_*ski 3 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)]
Run Code Online (Sandbox Code Playgroud)

输出:

[[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]]
Run Code Online (Sandbox Code Playgroud)

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

例如,在子列表[1,1,2], [1,2,1]中,给定值的数量总是相同的,也就是说,在每个子列表中有两个1和一个2,这就是为什么我认为子列表是相同的,这就是为什么我只想留下第一个一,即 [1,1,2].如何才能做到这一点?

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

Ror*_*ton 5

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

list1 = [list(i) for i in combinations_with_replacement(range(4),3)]
Run Code Online (Sandbox Code Playgroud)

之后的结果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]]
Run Code Online (Sandbox Code Playgroud)

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