簡體   English   中英

如何在Python中找到差異為1的每個元素的唯一集合?

[英]How to find the unique sets of each element where difference is 1 in Python?

我有一個整數數組。 我想找到差異為 1 的所有唯一集,並將它們分成唯一集。

示例輸入:[3,4,5,8,9,11]

示例輸出:[{3,4,5}, {8,9}, {11}]

用 Python 最簡單的方法是什么?

抓住鏈的開頭並將鏈的所有元素添加到一個集合中。

這是這個想法的超級簡單代碼:

def f(arr):
    res = []
    st = set(arr)
    for num in st:
        if num - 1 not in st: #begin of chain
            temp = []
            while num in st:
                temp.append(num)
                num += 1
            res.append(temp)
    return res
    
print(f([3,4,5,8,9,11]))

Output: [[3, 4, 5], [8, 9], [11]]

Time complexity: O(n)
Space complexity: O(n)

我想這是我們能達到的最好的復雜性。 (不要介意代碼中的變量名😁)

我假設您輸入的列表不包含重復項。 如果輸入是 [3,4,5,8,9,11,8,9,10] 我們是否想要唯一的集合為 [[3,4,5],[8,9,10,11],[8, 9]]? 如果是,那么我把它留給你作為練習。 提示:使用計數器/字典而不是上面的設置,這很容易。

也許不是最有效的,但您可以排序,然后根據差異進行拆分。 這是使用 numpy 的解決方案:

example_input = [3, 4, 5, 8, 9, 11]
output = np.split(np.sort(example_input),
                  np.where(np.diff(np.sort(example_input)) > 1)[0] + 1)

這樣做是找出排序數組元素之間的差異大於 1 的位置,然后將輸入拆分。 我們將一個添加到元素以在下一組拆分。

然后,如果您願意,可以將數組映射到集合。

sets = [set(x) for x in output]
# [{3, 4, 5}, {8, 9}, {11}]
  1. 您可以從第一個數字開始並繼續將其遞增 1,直到您獲得的新值不再位於原始列表中。
  2. 刪除原始列表中的值。
  3. 對剩余的值重復相同的過程。

這應該讓你開始

import typing

def find_unique(elems: list[int]) -> set[int]:
  ... # fill in your code here

def find_all_unique(elems: list[int]) -> typing.Iterator[set[int]]:
  while (elems):
    yield find_unique(elems)

if __name__ == '__main__':
  my_list = [3,4,5,8,9,11]
  print list(find_all_unique(my_list))

您可以先對輸入列表進行排序,然后用第一個元素初始化一個集合s

然后遍歷第二個到最后一個元素的排序列表,將數字num與其前一個數字prev_num進行比較。

  • 如果num == prev_num (如果輸入列表包含重復項),那么我們就忽略它。
  • 如果num == prev_num + 1 ,那么我們將num添加到同一個集合s
  • 否則,我們知道我們需要創建一個新集合。 我們將當前集合添加到輸出列表並創建一個新集合。
def find_unique_sets(input_list):
    output_list = []
    if not input_list:
        return output_list
    input_list.sort()
    s = {input_list[0]}
    prev_num = input_list[0]
    for i in range(1, len(input_list)):
        num = input_list[i]
        if num == prev_num:
            continue
        elif num == prev_num + 1:
            s.add(num)
        else:
            output_list.append(s)
            s = {num}
        prev_num = num
    output_list.append(s)
    return output_list

print(find_unique_sets([3,4,5,8,9,11]))

暫無
暫無

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

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