4 回答

TA貢獻1818條經驗 獲得超3個贊
連續子序列
OP 在評論中指出他們對連續的子序列感興趣。
選擇連續子序列所需的只是選擇起始索引i和結束索引j。然后我們可以簡單地返回切片l[i:j]。
def contiguous_subsequences(l):
return [l[i:j] for i in range(0, len(l)) for j in range(i+1, len(l)+1)]
print(contiguous_subsequences([1,2,3,4]))
# [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
這個函數已經在 more_itertools 包中實現,它被稱為substrings:
import more_itertools
print(list(more_itertools.substrings([0, 1, 2])))
# [(0,), (1,), (2,), (0, 1), (1, 2), (0, 1, 2)]
不連續的子序列
為了完整性。
查找可迭代對象的“冪集”是itertool 的秘訣:
import itertools
def powerset(iterable):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
return itertools.chain.from_iterable(itertools.combinations(s, r) for r in range(len(s)+1))
它也在包more_itertools中:
import more_itertools
print(list(more_itertools.powerset([1,2,3,4])))
# [(), (1,), (2,), (3,), (4,), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4), (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4), (1, 2, 3, 4)]

TA貢獻1862條經驗 獲得超6個贊
您可以簡單地在一行 ( ) 中使用列表理解來完成此操作O(N^2),這比您現有的方法更快:
>>> x = [1,2,3,4]
>>> [x[i:j] for i in range(len(x)) for j in range(i+1,len(x)+1)]
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
運行時間比較:
# your solution
>>> %timeit find(x)
9.23 μs ± 445 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#itertools method suggested by 'stef'
>>> %timeit list(more_itertools.substrings([1, 2, 3,4]))
3.18 μs ± 20.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#List comprehension method
>>> %timeit [x[i:j] for i in range(len(x)) for j in range(i+1,len(x)+1)]
3.09 μs ± 27.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

TA貢獻1898條經驗 獲得超8個贊
怎么樣:
a = [1, 2, 3, 4]
l = len(a)
ret = []
for i in range(l):
ll = i + 1
while ll <= l:
ret.append(a[i:ll])
ll +=1
print(ret)
印刷:
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]

TA貢獻1784條經驗 獲得超7個贊
這里的時間復雜度是O(N^2)
。
我不確定這個問題的時間復雜度是否可以進一步降低 ?_(ツ)_/?。
def find(arr):
? ? d = {}
? ? d[0] = []
? ? i = 1
? ? while (i <= len(arr)):
? ? ? ? d[i] = [] + d[i - 1]
? ? ? ? val = arr[i - 1]
? ? ? ? j = i - 1
? ? ? ? l = len(d[i - 1])
? ? ? ? while (j > 0):
? ? ? ? ? ? d[i].append(d[i - 1][l - j] + [val])
? ? ? ? ? ? j = j - 1
? ? ? ? d[i].append([val])
? ? ? ? i = i + 1
? ? return d[len(arr)]
input = [1, 2, 3, 4]
print(find(input))
輸出:
[[1], [1, 2], [2], [1, 2, 3], [2, 3], [3], [1, 2, 3, 4], [2, 3, 4], [3, 4], [4]]
添加回答
舉報