1

Python のリストに文字が出現する順序を考慮せずに、2 つの文字リストを一致させるにはどうすればよいですか?

例: 私の最初のリストは次のとおりで['a','b','c','d']、このリストを別のリストと一致させてから、出力を true として取得したいと考えて['b','c','a','d']います。これを行う方法?私はPythonが初めてで、あなたの助けが必要です!

前もって感謝します

4

3 に答える 3

11

どうですか:

# 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)
于 2012-06-21T14:23:30.893 に答える
5

それらを並べ替えることができます:

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
于 2012-06-21T14:25:46.073 に答える
5

私は別のことを念頭に置いていました。つまり、次のようなものです。

all(x in a for x in b) and all(x in b for x in a)

これは、 のすべての文字が に含まれるかどうか、および のすべての文字がaに含まれるかどうかをチェックします。これは、とがセットである場合に「一致」することを意味します。bba ab

しかし、すでに良い答えがあったので、速度を比較することにしました。私の解決策は、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

于 2012-06-21T14:49:54.727 に答える