0

以前、私は多くの素晴らしいプログラマーに機能を実行するのを手伝ってもらいました。ただし、インストラクターはそれを1つのループで望んでおり、すべての実用的なソリューションは複数のループを使用していました。

私は問題をほぼ解決する別のプログラムを書きました。ループを使用してすべての値を比較する代わりに、関数has_keyを使用して、その特定のキーが存在するかどうかを確認する必要があります。その答えは、一致する値を見つけるために辞書を繰り返す必要をなくします。なぜなら、uはそれらが一致するかどうかを知ることができるからです。繰り返しになりますが、charCountは、それ自体の定数をディクショナリに入力し、ディクショナリを返す関数です。

def sumPair(theList, n):
    for a, b in level5.charCount(theList).iteritems():    
        x = n - a     
        if level5.charCount(theList).get(a):
            if a == x:
                if b > 1: #this checks that the frequency of the number is greater then one so the program wouldn't try to multiply a single possibility by itself and use it (example is 6+6=12. there could be a single 6 but it will return 6+6
                    return a, x
            else:
                if level5.charCount(theList).get(a) != x:
                    return a, x           
print sumPair([6,3,8,3,2,8,3,2], 9)  

現在の要素が要素のリストに存在するかどうかを確認することにより、このコードに反復なしで合計を検出させる必要があります。

4

1 に答える 1

4

の代わりにcollections.Counter関数を使用できますlevel5.charCount

そして、なぜあなたがチェックする必要があるのか​​分かりませんif level5.charCount(theList).get(a):。必要ないと思います。aあなたがから得る鍵ですlevel5.charCount(theList)

だから私はあなたのコードを単純化します:

form collections import Counter

def sumPair(the_list, n):
    for a, b in Counter(the_list).iteritems():
        x = n - a
        if a == x and b >1:
            return a, x
        if a != x and b != x:
            return a, x

print sumPair([6, 3, 8, 3, 2, 8, 3, 2], 9)   #output>>> (8, 1)

また、次のようにリスト内包表記を使用できます。

>>>result = [(a, n-a) for a, b in Counter(the_list).iteritems() if a==n-a and b>1 or (a != n-a and b != n-a)]
>>>print result
[(8, 1), (2, 7), (3, 6), (6, 3)]
>>>print result[0]   #this is the result you want
(8, 1)
于 2012-06-13T01:49:41.893 に答える