8

私はパイソンを使用しています。リスト 1 は 7000 整数、リスト 2 は 25000 整数の 2 つのリストがあります。リスト 1 の各数値を調べて、リスト 1 の各数値よりも大きいリスト 2 の最も近い数値と、リスト 1 の各数値よりも小さい最も近い数値を見つけ、リスト 2 のこれら 2 つの数値の差を計算します。私は持っている:

for i in list1:
    for j in list 2:
        if list2[j]<list1[i]:
            a = max(list2)
        elif list2[j]>list1[i]:
            b = min(list2)
            interval = b-a

これはうまくいかないようです。リスト1の特定の数よりも小さく、最大値を知っているリスト2の明示的な数を見つけてから、リスト1の数よりも大きいリスト2の最小数を見つけたいと思います。誰かアイデアはありますか? ? ありがとう

4

4 に答える 4

6

NumPy を使用したベクトル化されたソリューションを次に示します。Python にはループがないため (最後の印刷段階を除いて)、非常に高速である必要があります。

import numpy as np

# set up fake data
l1 = np.array([1.9, 2, 2.1]) # or whatever list you have
l2 = np.array([1, 2, 5, 10]) # as above
l2.sort() # remove this line if it's always sorted

# the actual algorithm
indexes = np.searchsorted(l2, l1, side='right')
lower = l2[indexes - 1]
upper = l2[indexes]
diffs = upper - lower

# print results for debugging
for value, diff in zip(l1, diffs):
    print "value", value, "gap", diff

上記のようにハードコードされたテスト データの出力は次のとおりです。

value 1.9 gap 1
value 2.0 gap 3
value 2.1 gap 3
于 2013-05-28T12:26:53.420 に答える
3

まず第一に、あなたの例は有効なコードではないか、少なくともあなたがやりたいことをしていません。あなたが持っている場合

for i in list1:

i はインデックスではなく、list1 の要素です。したがって、最初に、list[i] と list[j] ではなく、i と j を比較します。

リスト内包表記を使用する方が簡単なはずです>

for i in list1:
    a = max([n for n in list2 if n < i])
    b = min([n for n in list2 if n > i])

a と b が存在することを確認するために、1 つまたは 2 つの if を追加する必要があるかもしれませんが、このように動作するはずです。

于 2013-05-28T12:11:21.767 に答える
0

numpy、bisect モジュール、またはリスト内包表記を使用しないソリューションを次に示します。楽しみ

list1=[1,2,4,8,16,32,64]
list2=[3,6,9,12,15,18,21]

correct={4:3, 8:3, 16:3}

lower=0
for t in list1:
  print t
  difference = 0
  index = lower
  while (difference == 0 and index<len(list2)-1):
    print "consider %d < %d and %d > %d" % (list2[index],t,list2[index+1],t)
    if list2[index]<t and list2[index+1] > t:
          lower = index
          upper = index + 1
          difference = list2[upper] - list2[lower]                              
          print "%d difference %d" % (t,list2[upper] - list2[lower])
          break
    index = index +1

  if t in correct.keys():
       assert(difference == correct[t])
于 2013-05-28T12:55:11.180 に答える