Python のリストに文字が出現する順序を考慮せずに、2 つの文字リストを一致させるにはどうすればよいですか?
例: 私の最初のリストは次のとおりで['a','b','c','d']
、このリストを別のリストと一致させてから、出力を true として取得したいと考えて['b','c','a','d']
います。これを行う方法?私はPythonが初めてで、あなたの助けが必要です!
前もって感謝します
Python のリストに文字が出現する順序を考慮せずに、2 つの文字リストを一致させるにはどうすればよいですか?
例: 私の最初のリストは次のとおりで['a','b','c','d']
、このリストを別のリストと一致させてから、出力を true として取得したいと考えて['b','c','a','d']
います。これを行う方法?私はPythonが初めてで、あなたの助けが必要です!
前もって感謝します
どうですか:
# if you don't want to consider duplicates either
output = set(your_first_list) == set(your_second_list)
# if duplicates matter
output = sorted(your_first_list) == sorted(your_second_list)
それらを並べ替えることができます:
In [1]: a = list('abcd')
In [2]: b = list('bcad')
In [3]: sorted(a) == sorted(b)
Out[3]: True
In [4]: a == b
Out[4]: False
私は別のことを念頭に置いていました。つまり、次のようなものです。
all(x in a for x in b) and all(x in b for x in a)
これは、 のすべての文字が に含まれるかどうか、および のすべての文字がa
に含まれるかどうかをチェックします。これは、とがセットである場合に「一致」することを意味します。b
b
a
a
b
しかし、すでに良い答えがあったので、速度を比較することにしました。私の解決策は、Daren と Lev が に基づいて提案した解決策よりもかなり高速sorted()
であることがわかりました。長さが 100 文字未満の文字列の場合、Daren のset(a) == set(b)
.
import timeit, random, string
def randstring(length):
return ''.join(random.choice(string.ascii_lowercase) \
for i in xrange(length))
def sortmatch(a,b):
return sorted(a) == sorted(b)
def bothways(a,b):
return all(x in a for x in b) and all(x in b for x in a)
def setmatch(a,b):
return set(a) == set(b)
c1 = "sortmatch(a,b)"
c2 = "setmatch(a,b)"
c3 = "bothways(a,b)"
init = """
from __main__ import randstring, sortmatch, bothways, setmatch
a = randstring(%i)
b = randstring(%i)
"""
lengths = [5,20,100,1000,5000]
times = 10000
for n in lengths:
t1 = timeit.Timer(stmt=c1, setup=init % (n,n))
t2 = timeit.Timer(stmt=c2, setup=init % (n,n))
t3 = timeit.Timer(stmt=c3, setup=init % (n,n))
print("String length: %i" % n)
print("Sort and match: %.2f" % (t1.timeit(times)))
print("Set and match: %.2f" % (t2.timeit(times)))
print("Check both ways: %.2f\n" % (t3.timeit(times)))
結果:
文字列の長さ: 5
並べ替えと一致: 0.04
セットと一致: 0.03
両方の方法をチェック: 0.02文字列の長さ: 20
並べ替えと一致: 0.11
セットと一致: 0.06
両方の方法をチェック: 0.02文字列の長さ: 100
並べ替えと一致: 0.53
セットと一致: 0.16
両方の方法を確認: 0.25文字列の長さ: 1000
並べ替えと一致: 6.86
セットと一致: 0.89
両方の方法を確認: 3.82文字列の長さ: 5000
並べ替えと一致: 36.67
セットと一致: 4.28
両方の方法を確認: 19.49