簡體   English   中英

匹配Python中的兩個字母列表

[英]Match two lists of letters in 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 這意味着, 如果設置 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM