1

2 つの数字が同じ数字で順序が異なるかどうかをチェックするプログラムを作成しようとしています。たとえば、232 と 223 は「true」と出力されますが、123 と 223 は「false」と出力されます。これで間違いはありませんが、答えは「真」である必要があり、そうではありません:

私のコード:

a=322 
b=223

list_a = list(str(a))
list_b = list(str(b))
c=len(str(a))
d=len(str(b))

j=0

if c != d:
    print "false"
else:
    for i in range(len(list_a)):
        while j<d:
           if i == list_b[j]:
            list_b.remove(list_b[j])
            break
           j=j+1
        j=0



if list_b==[]:
    print "true"
4

5 に答える 5

6

このようなものは明白な方法のように思えます:

#!/usr/bin/python

def same_digits(a, b):
    if sorted(str(a)) == sorted(str(b)):
        print "{0} and {1} contain the same digits".format(a, b)
    else:
        print "{0} and {1} do not contain the same digits".format(a, b)

same_digits(232, 232)
same_digits(232, 223)
same_digits(232, 233)

出力:

paul@local:~/src/python/scratch$ ./testnum.py
232 and 232 contain the same digits
232 and 223 contain the same digits
232 and 233 do not contain the same digits
paul@local:~/src/python/scratch$

各桁のに関係なく真に一致させたい場合は、次を使用setして重複を排除します。

#!/usr/bin/python

def same_digits(a, b):
    if sorted(set(str(a))) == sorted(set(str(b))):
        print "{0} and {1} contain the same digits".format(a, b)
    else:
        print "{0} and {1} do not contain the same digits".format(a, b)

same_digits(232, 232)
same_digits(232, 223)
same_digits(232, 233)
same_digits(232, 2333332232)
same_digits(232, 2)
same_digits(232, 234)

出力:

paul@local:~/src/python/scratch$ ./testnum2.py
232 and 232 contain the same digits
232 and 223 contain the same digits
232 and 233 contain the same digits
232 and 2333332232 contain the same digits
232 and 2 do not contain the same digits
232 and 234 do not contain the same digits
paul@local:~/src/python/scratch$

本当に難しい方法で行う必要がある場合、これは を使用せずに最初の例を複製しsorted()ます:

#!/usr/bin/python

def same_digits_loop(a, b):
    a_alpha = str(a)
    b_alpha = str(b)

    if len(a_alpha) != len(b_alpha):
        return False

    for c in a_alpha:
        b_alpha = b_alpha.replace(c, "", 1)

    return False if len(b_alpha) else True


def same_digits(a, b):
    if same_digits_loop(a, b):
        print "{0} and {1} contain the same digits".format(a, b)
    else:
        print "{0} and {1} do not contain the same digits".format(a, b)


same_digits(232, 23)
same_digits(232, 232)
same_digits(232, 223)
same_digits(232, 233)
same_digits(232, 2333)

そして出力:

paul@local:~/src/python/scratch$ ./testnum3.py
232 and 23 do not contain the same digits
232 and 232 contain the same digits
232 and 223 contain the same digits
232 and 233 do not contain the same digits
232 and 2333 do not contain the same digits
paul@local:~/src/python/scratch$

最新の編集で質問にあるコードについては、次のように変更してください。

if i == list_b[j]:

に:

if list_a[i] == list_b[j]:

そしてそれはうまくいくでしょう。そうは言っても、これを行うと次のようになるため、常に機能するとは限りません。

while j<d:

から要素を削除するたびlist_bに、 の長さlist_bは変わりますが、変わりdません。d毎回新しい長さに等しくなるように更新しない限り、数字が同じでない場合は範囲​​外にlist_bなり、 の終わりに達する前に が空になったかどうかを確認しますlist_a

于 2013-10-26T14:07:47.927 に答える
1

Counter オブジェクトを使用して各数字文字列のフィンガープリントを取得し、2 つのフィンガープリントを比較するだけです。

In [1]: n1 = 123

In [2]: n2 = 312

In [3]: n1, n2 = map(str, [n1, n2])

In [4]: n1,n2
Out[4]: ('123', '312')   

In [5]: from collections import Counter

In [6]: c1 = Counter(n1)

In [7]: c2 = Counter(n2)

In [8]: c1 == c2
Out[8]: True

In [9]: c1
Out[9]: Counter({'1': 1, '3': 1, '2': 1})

In [10]: c2
Out[10]: Counter({'1': 1, '3': 1, '2': 1})

文字列の桁数を気にしない場合は、 set 組み込み型を使用してフィンガープリントを取得できます。

In [13]: n1 = 112

In [14]: n2 = 212

In [15]: n1, n2 = map(str, [n1, n2])

In [16]: s1 = set(n1)

In [17]: s2 = set(n2)

In [18]: s1
Out[18]: set(['1', '2'])

In [19]: s2
Out[19]: set(['1', '2'])

In [20]: s1 == s2
Out[20]: True

あなたがしなければならない唯一の仕事は、ある種の指紋を見つけることです!

于 2013-10-26T14:17:18.897 に答える
0

iスニペットの変数は整数ではなく文字列ですTypeError。変化する

if list_a[i] == list_b[j]:

if i == list_b[j]:

iインデックスのように使用したい場合は、forループを次のように変更します。

for i in range(len(list_a)):

また、python のインデックスは 1 からではなく 0 から始まるので、

j = 1

j = 0

もう1つの修正:

while j <= d:

while j < d:

したがって、範囲外のインデックスはありません。

これも:

list_a = list(str(a))
list_b = list(str(b))
于 2013-10-26T14:23:55.817 に答える