簡體   English   中英

有條件的排列

[英]Permutations with condition

社區!

我正在嘗試解決此任務:

輸入:我有一個單詞列表。 Output:我需要返回每個符合條件的排列列表:

  • 所有排列在輸入列表中都有一個鄰居
  • 列表元素的順序不能改變

例子:

In: ['cat', 'sat', 'on']
Out: [('cat', 'sat', 'on'), ('cat', 'sat'), ('sat', 'on'), ('cat'), ('sat'), ('on')]

解釋示例:不允許排列 ('cat','on'),因為 'cat' 和 'on' 不是輸入列表中的鄰居。 不允許排列 ('cat','on','sat'),因為 inout 列表中的 'on' 在 'sat' 時更正確,但在這種排列中,單詞的順序沒有被保存。

我試過寫這個 function 並在之后清除它的結果:

def findsubsets(S,m): 
    return set(itertools.combinations(S, m))

但我認為,然后我們生成所有可能的組合(在大多數操作系統情況下,我有很多單詞的列表),我們使用了很多 memory,所以我試圖找到不會生成組合的解決方案之后我會選擇我需要的排列。 我正在尋找明確的解決方案,無需額外的轉換。

我正在寫Python 3並且我正在尋找至少 memory 的這些任務的解決方案。 我在這個網站上搜索類似的問題,但沒有找到。

預先感謝您解決此問題。

看起來你正在尋找的是
一組可能的子列表,您可以通過簡單的循環獲得。

original = ['cat', 'sat', 'on']
result = []

n = len(original)
for i in range(n):
    for j in range(i + 1, n + 1):
        # Append tuple(original[i:j]) if that's what you are looking for
        result.append(original[i:j])

print(result)
[['cat'], ['cat', 'sat'], ['cat', 'sat', 'on'], ['sat'], ['sat', 'on'], ['on']]

一個簡短的遞歸方法:

original = ['cat', 'sat', 'on']
def combos(d):
  yield tuple(d)
  yield from ([] if not d else combos(d[1:]))
  yield from ([] if not d else combos(d[:-1]))

result = list(set(filter(None, combos(original))))

Output:

[('sat', 'on'), ('sat',), ('cat',), ('on',), ('cat', 'sat'), ('cat', 'sat', 'on')]

暫無
暫無

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

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