[英]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}]
這應該讓你開始
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.