Совпадение двух списков букв в Python

Как можно сопоставить два списка букв, не учитывая порядок появления букв в этих списках в Python

Например: думаю, мой первый список['a','b','c','d'] и я хочу сопоставить этот список с другим списком['b','c','a','d'] затем, чтобы получить положенный результат. Как это сделать? Я новичок в Python и хочу вашей помощи!

заранее спасибо

 sloth21 июн. 2012 г., 16:51
@MarkReed Вы можете понизить число ответов на вопрос и проголосовать, чтобы закрыть вопрос. Даже если вы не получите очки репутации за ответы на подобные вопросы, люди все равно ответят. Да, я знаю, что подобные вопросы являются «легко зарабатываемым представителем», и очень жаль, что некоторые замечательные ответы не получают того внимания, которого они заслуживают, а только того, как работает stackoverflow. Например. посмотрите на мой второй по популярности ответ. 15 голосов за опечатку; в то время как некоторые из моих ответов заняли почти полчаса, и я получил только 1 или 2 отзыва. Грустно, но верно ...
 georg21 июн. 2012 г., 17:06
@BigYellowCactus: Очень верно. Так или иначе, SO ненавидит вопросы RTFM, но увлечен ответами RTFM, хотя последний такой же плохой.
 Mark Reed21 июн. 2012 г., 16:24
What have you tried? Но я не знаю, почему я беспокоюсь, кто-то сделает вашу работу за вас, чтобы получить очки репутации.

Ответы на вопрос(3)

Вы можете отсортировать их:

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
 21 июн. 2012 г., 16:57
+1, этот метод более гибкий, в том смысле, чтоa = list('aabcd') а такжеb = list('abcd') не будет соответствовать.

Я имел в виду что-то другое, то есть, как это:

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

Это проверяет, все ли буквы вa происходят вbи все буквыb происходят вa, Это означает, что они "совпадают"if a а такжеb наборы.

Но так как уже был хороший ответ, я решил сделать сравнение скорости, и оказалось, что мое решениеconsiderably faster чем решение, предложенное Дарен и Лев на основе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)))

Результаты:

String length: 5
Sort and match: 0.04
Set and match: 0.03
Check both ways: 0.02

String length: 20
Sort and match: 0.11
Set and match: 0.06
Check both ways: 0.02

String length: 100
Sort and match: 0.53
Set and match: 0.16
Check both ways: 0.25

String length: 1000
Sort and match: 6.86
Set and match: 0.89
Check both ways: 3.82

String length: 5000
Sort and match: 36.67
Set and match: 4.28
Check both ways: 19.49

 21 июн. 2012 г., 17:04
Быстро это хорошо, но они все равно не эквивалентны, верно?
 21 июн. 2012 г., 17:20
Так что это в основном показывает, что сортировка и создание наборов сопряжены с некоторыми накладными расходами, и может быть полезно подумать о том, действительно ли вам это нужно.
 21 июн. 2012 г., 17:08
@Lev: Нет, я полагаю, нет. Однако он работает для примера OP и работает в общем случае, если a и b являются множествами, и затем он все же быстрее, чем решение Daren для коротких строк.
 22 июн. 2012 г., 09:59
+1, очень интересно. спасибо, что прошли лишнюю милю на этом!
Решение Вопроса

Как насчет:

# 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)
 Grant21 июн. 2012 г., 16:27
ХОРОШО! это сработало для меня Спасибо за ответ :)

Ваш ответ на вопрос