2

0から99の範囲の同じ長さの2つのランダムリストがあります。

lista = [12,34,45,56,66,80,89,90]

listb = [13,30,56,59,72,77,80,85]

重複番号の最初のインスタンスと、それがどのリストからのものであるかを見つける必要があります。この例では、listbで番号「56」を見つけてインデックスを取得する必要がありますi = 2

ありがとう。

更新:数回実行した後、次のエラーが発生しました:

    if list_a[i] == list_b[j]:
IndexError: list index out of range

@Asteriskが提案したように、私の2つのリストは同じ長さでソートされており、最初はiとjの両方が0に設定されています。そのビットは、遺伝的乗換えコードの一部です。

  def crossover(r1,r2):
    i=random.randint(1,len(domain)-1) # Indices not at edges of domain
    if set(r1) & set(r2) == set([]): # If lists are different, splice at random
      return r1[0:i]+r2[i:]
    else: # Lists have duplicates
      # Duplicates At Edges
      if r1[0] == r2[0]: # If [0] is double, retain r1
        return r1[:1]+r2[1:]
      if r1[-1] == r2[-1]: # If [-1] is double, retain r2
        return r1[:-1]+r2[-1:]
      # Duplicates In Middle
      else: # Splice at first duplicate point
        i1, i2 = 0, 0
        index = ()
        while i1 < len(r1):
          if r1[i1] == r2[i2]:
            if i1 < i2:
              index = (i1, r1, r2)
            else:
              index = (i2, r2, r1)
            break
          elif r1[i1] < r2[i2]:
            i1 += 1
          else:
            i2 += 1
      # Return A Splice In Relation To What List It Appeared First
      # Eliminates Further Duplicates In Original Lists
      return index[2][:index[0]+1]+index[1][index[0]+1:] 

この関数は2つのリストを受け取り、1つを返します。ドメインは10個のタプルのリストです:(0,99)。

私が言ったように、エラーは毎回発生するわけではなく、たまにしか発生しません。

私はあなたの助けに感謝します。

4

4 に答える 4

1

私はPythonの人ではありませんが、これはアルゴリズムの質問です...

各リストへのインデックスを維持し、それらの2つのリスト位置にある要素を確認します。

現在の位置に最小の要素があるリストはどれでも、そのリストの次の要素に移動します。

他のリストの現在の要素と同じ要素を見つけた場合、それが最小の複製です。

いずれかのリストの最後に到達した場合、重複はありません。

于 2012-10-05T02:48:01.363 に答える
1

すべての重複を探している場合は、次のようなものを使用できます。

list_a = [12,34,45,56,66,80,89,90]
list_b = [13,30,56,59,72,77,80,85]

set_a = set(list_a)
set_b = set(list_b)

duplicates = set_a.intersection(set_b)
# or just this:
# duplicates = [n for n in list_a if n in list_b]

for duplicate in duplicates:
    print list_a.index(duplicate)

いずれかのリストで重複の最小インデックスを取得するには、次のようにします。

a_min = min(map(list_a.index, duplicates))
b_min = min(map(list_b.index, duplicates))

if a_min < b_min:
    print 'a', a_min, list_a[a_min]
else:
    print 'b', b_min, list_b[b_min]

そうでない場合、これは少しうまくいくはずです:

duplicate = None

for n in set_a:
    if n in set_b:
        duplicate = n
        break

if duplicate is not None:
    print list_a.index(duplicate)
于 2012-10-05T02:48:08.230 に答える
0
lista = [12,34,45,56,66,80,89,90]

listb = [13,30,56,59,72,77,80,85]

i, j = 0, 0
while i < len(lista):    
    if lista[i] == listb[j]:
        if i < j:
            print i, lista
        else:
            print j, listb
        break
    elif lista[i] < listb[j]:
        i += 1
    else:
        j += 1


>>> 
2 [13, 30, 56, 59, 72, 77, 80, 85]

前提条件:両方のリストの長さが同じで、並べ替えられている

于 2012-10-05T03:14:14.403 に答える
0

位置0、次に1、次に2ですべてのリストをスキャンするだけです...見たものを追跡します(O(1)時間でセットを照会できます)。

def firstDuplicate(*lists):
    seen = {}
    for i,tup in enumerate(zip(*lists)):
        for listNum,value in enumerate(tup):
            position = (listNum,i)
            if value in seen:
                return value, [seen[value], position]
            else:
                seen[value] = position

デモ:

>>> value,positions = firstDuplicate(lista,listb)
>>> value
56
>>> positions
[(1, 2), (0, 3)]

(N個のリストに一般化されていません...まだ。を使用するには微調整が必​​要です。defaultdict(set)すべてのインデックスをタプルとして一緒に挿入してから、重複をチェックしてください。)

于 2012-10-05T03:21:54.287 に答える