-9

2つの文字列を要素ごとに比較するための高速関数が必要です。例:

text1 = 'absabeadg'
text2 = 'abSatyaxguz'
diff = compare(text1,text2) # should return diff=[1,1,0,1,0,0,1,0,1,0,0]
4

3 に答える 3

14

ゼロの努力が示されましたが、一体何なのですか、それは週末です:

>>> text1 = 'absabeadg'
>>> text2 = 'abSatyaxguz'
>>> 
>>> from itertools import izip_longest
>>> 
>>> [int(c0==c1) for c0, c1 in izip_longest(text1, text2)]
[1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0]

これは、izip_longestを使用して (潜在的に) 異なる長さのシーケンスを結合int(True) == 1int(False) == 0ます。

[アップデート:]

この出力が十分に意味があるかどうかについてはいくつかの論争があるように思われるため、同じ答えを与える別のアプローチを次に示します。

>>> [int(text1[i:i+1] == text2[i:i+1]) for i in range(max(len(text1), len(text2)))]
[1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0]

(私が知る限り、議論は何かと何も比較しないときに戻ることが理にかなって0いるようです。それは完全に合理的であり、文字列スライスがどのように動作するかだと思います-空の文字列を空でない文字列と比較できます文字列と常に取得しFalse == 0ます。)

于 2013-01-04T23:05:05.923 に答える
3

no-import-modules-readable-solutionの場合、これを使用できると思います:)

text1 = "absabeadg"
text2 = "abSatyaxguz"
len1 = len(text1)
len2 = len(text2)
result = []
for index in range(min(len1, len2)):
    result.append(int(text1[index] == text2[index]))
result.extend([0]*abs(len1-len2))
print result

リスト内包の楽しみのために:

text2 = "absabeadg"
text1 = "abSatyaxguz"
len1 = len(text1)
len2 = len(text2)

print [int(text1[i] == text2[i]) for i in range(min(len1, len2))] + [0]*abs(len1-len2)
于 2013-01-04T23:25:02.430 に答える
2

numpy/pylab を使用できます:

import pylab as p

a = p.fromstring("asdfg", dtype=p.int8)
b = p.fromstring("aqwer", dtype=p.int8)

print a == b

文字列の長さが異なる場合は結果を自分でパディングし、必要に応じてブール値の配列を整数のリストに変換する必要があります。

于 2013-01-04T23:05:59.047 に答える