如何在不考虑 Python 列表中字母出现顺序的情况下匹配两个字母列表
例如:认为我的第一个列表是['a','b','c','d']
,我想将这个列表与另一个列表匹配,['b','c','a','d']
然后得到一个输出为真。这该怎么做?我是 python 新手,需要你的帮助!
提前致谢
如何在不考虑 Python 列表中字母出现顺序的情况下匹配两个字母列表
例如:认为我的第一个列表是['a','b','c','d']
,我想将这个列表与另一个列表匹配,['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 个字符的字符串,它也优于达人的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