2016-10-31 69 views
3

嘿,我在我的代碼中遇到了一個新問題。有一點我有一個列表,看起來像這個。 (通常是更長的時間,但是這不是進口來理解問題)替換字符串列表中的字符並創建所有可能性

['-0---11-', '--1--110', '01---100', '1--101-0', '10-1-1-0'] 

在與酒吧的位置可以是0或1。現在我想知道的,例如,只有3條多少唯一的字符串列表代表左邊。在上面的例子中,最後三個字符串已經只有三個小節,但前兩個字符串有四個和五個小節。 '-0---11-'可以代表'-0--1111','-0--1110','000--11-',.... 所以我的想法基本上是首先創建所有可能性,然後搜索唯一的可能性,這樣我就不會過多計算。我現在的問題是如何創造所有可能性?

編輯:另一個更簡單的例子,可能會澄清我的問題。比方說,名單看起來像:

['--11', '--10', '010-'] 

現在我想看看有多少獨特的字符串有當我只有在最高1巴。每個欄代表1或0,所以我必須寫下所有的可能性。結果將是:

['-111', '-011', '0-11', '1-11', '-010', '-110', '0-10', '1-10', '010-'] 

我希望我沒有忘記任何可能性。現在我必須搜索重複項並想刪除它們。在這個例子中,我沒有完成任何工作。

+2

您能否重新說明您的問題。 – thesonyman101

+1

查看[Combinatorics](https://en.wikipedia.org/wiki/Combinatorics)和[Khan Academy:Permutation](https://www.khanacademy.org/math/statistics-probability/probability-library/permutation- LIB/v /置換配方)。 –

+0

在閱讀Peter Wood的建議之後,查看Python的組合/排列支持=> https://docs.python.org/2/library/itertools.html#itertools.combinations – johntellsall

回答

1

你可以使用這樣的

def possibilities(pattern, ndash=0): 
    if ndash <= pattern.count('-'): 
     if not pattern: 
      yield '' 
     else: 
      if pattern[0] == '-' and ndash > 0: 
       for subpattern in possibilities(pattern[1:], ndash - 1): 
        yield '-' + subpattern 
      for subpattern in possibilities(pattern[1:], ndash): 
       if pattern[0] in '0-': 
        yield '0' + subpattern 
       if pattern[0] in '1-': 
        yield '1' + subpattern 

遞歸解決方案這是一臺發電機的功能,因此爲了從中獲得價值,你需要遍歷發電機。

>>> gen = possibilities('1----0', 3) 
>>> for s in gen: 
...  print s 

或者您可以將其送到list以獲得所有可能性的列表。

>>> from pprint import pprint 
>>> pprint(list(possibilities('1----0', 3) 
['1---00', 
'1---10', 
'1--0-0', 
'1--1-0', 
'1-0--0', 
'1-1--0', 
'10---0', 
'11---0'] 
+0

對不起,我對python很陌生,此代碼看起來像高級。你能解釋一下嗎?此外,我不知道如何將您的解決方案整合到我的代碼中。 'print(possible(mylist,2))'只是給了我'<發生器對象的可能性在0x10d83dba0>' – HighwayJohn

+0

好吧,所以在搜索了一些關於發生器函數之後,我認爲'爲可能性值(mylist,2):print(value) '可以工作,但它也沒有。我現在真的有點困惑。我很抱歉.. – HighwayJohn

+0

@HighwayJohn有一個錯誤,只是更新它的工作。 –

相關問題