2016-11-27 9 views
1

2つのリストを受け入れる関数を書くように割り当てられ、もう一方のリストがもう一方の循環置換の場合はTrueを返します。 最初の場所と最後の場所の間で2つのリストと変更を受け入れる関数を作成しました。その後、私はforループを使って最初の関数を呼び出す関数を書いて、ループの最後にTrueを返します。 私はコードを実行しようとすると、いくつかのエラーメッセージに遭遇アイブ:2つのリストが相互の巡回置換であるかどうかを判断する

ファイル「C:/WinPython-64bit-3.5.2.2Qt5/settings/.spyder-py3/temp.py」環状 では、ライン13、場合にchange_position(LST1、LST2):

ファイル "C:/WinPython-64bit-3.5.2.2Qt5/settings/.spyder-py3/temp.py" change_position lst3において、ライン5、[0] = lst4 [ lenはここ(lst4)]

は私のコードです:

def change_position(lst3, lst4): 
    if len(lst3) != len(lst4): 
     print(False) 
    else: 
     lst3[0] = lst4[len(lst4)] 


def cyclic(lst1, lst2): 
    if len(lst1) != len(lst2): 
     print(False) 
    else: 
     for i in range(len(lst1)): 
      if change_position(lst1, lst2): 
       print(True) 
      else: 
       print(False) 
cyclic([1, 2, 3, 4], [4, 1, 2, 3]) 

誰も私はこれを修正する方法を知っているので、機能は動作しますか? ご協力いただきありがとうございます。

答えて

0

あなたのリストを並べ替えする必要はありません、インデックスのみの計算が

def is_cyc_perm (list1, list2): 
    if len (list1) == len (list2): 
     for shift in range (len (list1)): 
      for i in range (len (list1)): 
       if list1 [i] != list2 [(i + shift) % len (list1)]: 
        break 
      else: 
       return True 
     else: 
      return False 
    else: 
     return False 


print (is_cyc_perm ([8, 2, 5, 7], [8, 2, 5, 7])) 
print (is_cyc_perm ([7, 8, 2, 5], [8, 2, 5, 7])) 
print (is_cyc_perm ([2, 5, 7, 8], [8, 2, 5, 7])) 
print (is_cyc_perm ([8, 5, 2, 7], [8, 2, 5, 7])) 
print (is_cyc_perm ([7, 2, 5, 8], [8, 2, 5, 7])) 
print (is_cyc_perm ([8, 2, 5, 3], [8, 2, 5, 7])) 
0

を行いますリストのインデックスは0から始まる、あなたは、範囲(0、LEN(リスト)-1)を使用する必要があります。

def change_position(lst3, lst4): 
    if len(lst3) != len(lst4): 
     print(False) 
    else: 
     lst3[0] = lst4[len(lst4)-1] 


def cyclic(lst1, lst2): 
    if len(lst1) != len(lst2): 
     print(False) 
    else: 
     for i in range(len(lst1)-1): 
      if change_position(lst1, lst2): 
       print(True) 
      else: 
       print(False) 
0

ダブルリンクリストの回転は、ポインタを使用した簡単な操作です。一致するものがあれば、すべての回転を試すことができます。

collectionsモジュールにはCounterもあり、両方のリストが同じ要素の同じカウントを持つ場合、クイックテストに使用できます。それは明らかに同じ長さのチェックのより強力なバージョンです。

import collections 

def is_cyc_perm(seq1, seq2): 
    mset1 = collections.Counter(seq1) 
    mset2 = collections.Counter(seq2) 
    if mset1 != mset2: 
     return False 

    size = len(seq1) 
    deq1 = collections.deque(seq1) 
    deq2 = collections.deque(seq2) 
    for _ in range(size): 
     deq2.rotate() 
     if deq1 == deq2: 
      return True 
    return False 
関連する問題