匹配Python中的两个字母列表

时间:2012-06-21 14:22:09

标签: python

如何匹配两个字母列表而不考虑Python中该列表中字母的出现顺序

例如:认为我的第一个列表是['a','b','c','d'],我希望将此列表与另一个列表['b','c','a','d']匹配,然后将输出视为真。这该怎么做?我是python的新手,希望得到你的帮助!

提前致谢

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分:5)

我有一些不同的想法,就是这样:

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

这会检查a中的所有字母是否出现在b中,而b的所有字母都出现在a中。这意味着,如果 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