簡體   English   中英

從符合特定條件的列表中刪除子列表

[英]Removing a sublist from a list that meets a certain condition

我使用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 ,這就是為什么我認為子列表是相同的,這就是為什么我只想留下第一個,即[1,1,2] 如何才能做到這一點?

我正在考慮計算每個子列表中相應值的數量,並創建一個列表,其中包含有關給定值的數量的發生特征,然后檢查循環中列表list_1中的每個元素或具有給定特征的元素之前沒發生過。 但在我看來,這非常復雜。

使用combination_with_replacement而不是使用itertools模塊中的product 這樣就可以在一行中完成你想做的事情而不需要任何按摩:

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對象轉換為元組。

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

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]]

現在,有比排序每個子列表更有效的選項,但我會把它留給你。

這可能會成功:

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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM