3

問題は次のとおりです。 という関数を作成する必要があります。この関数isSublist()は 2 つの引数 ( list, sublist)を取り1、sublist が list のサブリストである場合は 0 を返し、それ以外の場合は 0 を返します。

だから私は自分のコードを持っていますがTrue、サブリストがリストにないときに取得します。これを修正するための提案はありますか?

 def isSublist(list, sublist):
    for i in range(len(list)-(len(sublist))+1):
        return True
    if sublist==list[i:i+(len(sublist))]:
        return False

サンプル入力:

list= (0,1,2,3,4,5,6,7,8,9)
isSublist(list, [1,2,3])
output:
True
4

5 に答える 5

7

サブリストのサイズのすべてのスライスを取得し、等しいかどうかを比較することで、これを分割できます。

def n_slices(n, list_):
    for i in xrange(len(list_) + 1 - n):
        yield list_[i:i+n]

def isSublist(list_, sub_list):
    for slice_ in n_slices(len(sub_list), list_):
        if slice_ == sub_list:
            return True
    return False

注文の問題をカバーするため。リストは、定義上、順序付けられています。順序付けを無視したい場合は、set を実行できます。

def isSubset(list_, sub_list):
    return set(sub_list) <= set(list_)

繰り返される要素をカバーし、順序を無視する必要がある場合は、マルチセットの領域にいます。

def isSubset(list_, sub_list):
    for item in sub_list:
        if sub_list.count(item) > list_.count(item):
            return False
    return True
于 2013-11-15T00:29:39.663 に答える
0

あなたの問題の一部は、Python(0,1,2,3,4,5,6,7,8,9)では技術的に alistではなく、tuple本質的に不変 (変更不可能) である -- であるということlistです。また、組み込みの関数や型と同じ名前をプログラム内で使用することは避ける必要があります。これらを参照する必要がある場合があり、独自の定義によって、システムによって提供されるものが隠されるからです。

これを回避する簡単な方法の 1 つは、名前の末尾に an を追加することです。次のように、最初に引数が a でない場合に_引数を a に変換しようとします。list引数の型はテストしませんsublistが、同様のチェックが適切な場合もあります。

def isSublist(list_, sublist):
    if not isinstance(list_, list):
        list_ = list(list_)
    sublen = len(sublist)
    for i in xrange(len(list_)-sublen+1):
        if list_[i:i+sublen] == sublist:
            return True
    return False

list_ = (0,1,2,3,4,5,6,7,8,9)
print subfunc(list_, [0,1])  # --> True
print subfunc(list_, [1,2,3])  # --> True
print subfunc(list_, [4,6,7])  # --> False
print subfunc(list_, [4,5])  # --> True
于 2013-11-15T02:07:08.813 に答える
0
def isSublist(x, y):
  occ = [i for i, a in enumerate(x) if a == y[0]]
  for b in occ:
      if x[b:b+len(y)] == y:
           print 'YES-- SUBLIST at : ', b
           return True
      else:
           pass
      if len(occ)-1 ==  occ.index(b):
           print 'NO SUBLIST'
           return False

list1 = [1,0,1,1,1,0,0]
list2 = [1,0,1,0,1,0,1]

#should return True
isSublist(list1, [1,1,1])

#Should return False
isSublist(list2, [1,1,1])
于 2016-04-14T11:59:53.773 に答える
0
>>> def isSublist(originallist,sublist,biglist):
    if not sublist:
        return True
    if not biglist:
        return False
    if sublist[0]==biglist[0]:
        return isSublist(originallist,sublist[1:],biglist[1:]) or isSublist(originallist,sublist,biglist[1:])
    return isSublist(originallist,originallist,biglist[1:])

テスト出力:

>>> isSublist([1,2,4],[1,2,4],[1,2,3,4])
False
>>> isSublist([1,2,3],[1,2,3],[1,2,3,4])
True
>>> 

サブセットではなく、サブリスト用に編集。醜いですが、機能します。パラメータの混乱を避けるためにラッパーを追加できます。

def sublist(a,b):
    isSublist(a,a,b)
于 2013-11-15T00:39:02.287 に答える