1

コードについて本当に助けが必要です。ユーザーは 10 個の整数を入力する必要があり、プログラムは最も近いペアを表示する必要があります。私は itertools を使用してそれを行うことができましたが、私の教授は .sort ()、min()、enumerate() などを受け入れません...手動で行う必要があります。itertools を使用して作成できたコードは次のとおりです。

import itertools

a = [0,1,2,3,4,5,6,7,8,9]

a[0]=input()
a[1]=input()
a[2]=input()
a[3]=input()
a[4]=input()
a[5]=input()
a[6]=input()
a[7]=input()
a[8]=input()
a[9]=input()


a.sort()

for item in enumerate(a):             
c = min(itertools.combinations(b, 2),
                   key=lambda item: abs(item[0]-item[1]))

print 'The closest pair/One of the closest pair is: ', c

手動の最も近いペアプログラムの場合、これまでのコードは次のとおりです。

a=[0,1,2,3,4,5,6,7,8,9]
a[0]=input()
a[1]=input()
a[2]=input()
a[3]=input()
a[4]=input()
a[5]=input()
a[6]=input()
a[7]=input()
a[8]=input()
a[9]=input()

#Sorting the Array
b = True             #para sa swapping
while b==True:
b= False
for i in range(0,len(a)-1):
    if (a[i]>a[i+1]):
        c=a[i]
        a[i]=a[i+1]
        a[i+1]=c
        b=True

#Generate all the posible combinations of 

どんなに頑張って調べても終わらない..助けていただければ幸いです...

ありがとう、アイレン

4

3 に答える 3

1

あなたの教授itertools.combinations()が不必要に非効率的であるとして使用する回答を拒否するのは不合理ではないと思います. すべての組み合わせを調べる必要はありません。配列を並べ替える場合は、隣接するアイテム間の最小の差を見つけるだけでよく、それらのアイテムが最も近いペアになります。

したがって、問題は、使用が許可されているかどうか.sort()(許可されていない場合は、独自の並べ替えアルゴリズムを実装する必要があります) と、隣接する値の最小の差を見つけるループを作成する方法を知っているかどうかに帰着します。これらは両方とも演習として残しておきます。

于 2012-12-10T14:45:57.337 に答える
1

これを確認してください。あなたにとって良いと思います。

# fill the array with input
a = [int(num) for num in raw_input().split(" ")]

# REVERSE sorting the array
for j in range(len(a) - 1, -1, -1):
    for i in range(0, j):
        if (a[i] < a[i+1]):
            c = a[i]
            a[i] = a[i+1]
            a[i+1] = c

min = a[0] + a[1]

for i in range(0, len(a) - 1):    
    if min > a[i] - a[i + 1]:
        min = a[i] - a[i + 1]

print min
于 2012-12-10T15:20:59.853 に答える
0

各番号を見て、それとペアになる可能性のある各(他の)番号を見るだけでは、非常に非効率的に行うことができます. 可能な各ペアを繰り返した後、最も近いペアを返すことができます。

numbers = [7,15,0,4,3,12,76]


def pair_distance(pair):
    return abs(pair[0] - pair[1])

closest_pair = None

for i, number1 in enumerate(numbers):
    for j, number2 in enumerate(numbers):
        if i != j: #Otherwise we'd always have numbers[0], numbers[0] as pair!
            pair = number1, number2
            if closest_pair is None or pair_distance(pair) < pair_distance(closest_pair):
                closest_pair = pair


print "The closest pair is", closest_pair

残念ながら、列挙が許可されていないことを見逃していました。

i = -1
j = -1
for number1 in numbers:
    i += 1
    for number2 in numbers:
        j += 1
        if i != j: #Otherwise we'd always have numbers[0], numbers[0] as pair!
            pair = number1, number2
            if closest_pair is None or pair_distance(pair) < pair_distance(closest_pair):
                closest_pair = pair

これは宿題なので、提出する前に、なぜこれが機能するのか、なぜ非効率なのかを理解しようとすることをお勧めします!

コメントで提案されているように、最初にリストを並べ替えると、より効率的なソリューションが得られます。


ただし、おそらくこのタスクに Python を使用するべきではないと思います。高水準言語で低水準の構造を使用することには、学習上の価値はあまりありません。

于 2012-12-10T14:43:08.407 に答える