2010-12-11 2 views
2
main = ['123', '147', '159', '258', '369', '357', '456', '789'] 

match1 = 1374 
match2 = 1892 

здесь match1 имеет 1, 4 и 7, но у главного есть «147», поэтому он соответствует. match2 имеет 1,8,9,2, что не соответствует main. Что такое оптимизированное решение?лучший способ сопоставить эту строку или список?

+4

* Что такое решение оптимизировать * - Оптимизирован для чего? Читаемость я предполагаю (надеюсь)? –

+0

Вы имеете в виду, что 3 или более цифр совпадают и 2 или менее не совпадают? Это зависит от 'len (str (match1))'? – khachik

+0

main имеет значение «123», поэтому, если любая строка «3429523913» имеет все значения 1, 2 и 3. Таким образом, она соответствует. То есть он проверяет весь элемент списка и сопоставляет цифры в элементе. – Tauquir

ответ

4

Сначала вам нужно преобразовать номера входов в строки, поскольку вас интересуют цифры, которые они содержат, а не фактические значения. Вы можете использовать str для этого.

Чтобы решить актуальную проблему вы хотите, чтобы проверить, есть ли любой строка в основных таких, что всех символов в этой строке содержится в строка матча.

any(all(c in match for c in x) for x in main) 

Вот более полная программа испытаний:

main = ['123', '147', '159', '258', '369', '357', '456', '789'] 

match1 = str(1374) 
match2 = str(1892) 

def has_any_match(main, match): 
    return any(all(c in match for c in x) for x in main) 

print has_any_match(main, match1) 
print has_any_match(main, match2) 

Выход:

 
True 
False 

Если один вкладыш слишком много, чтобы поглотить, вы можете разбить его вверху:

def is_match(word, match): 
    # Test if all the characters in word are also in match. 
    return all(c in match for c in word) 

def has_any_match(main, match): 
    # Test if there is any word in main that matches. 
    return any(is_match(word, match) for word in main) 
+0

+1 - быстро и точно - выдающийся. –

4

Возможно использовать sets и проверить, если один набор является подмножеством другого:

main = ['123', '147', '159', '258', '369', '357', '456', '789'] 
main = map(set,main) 
match1 = set('1374') 
match2 = set('1892') 
print(any(elt.issubset(match1) for elt in main)) 
# True 

print(any(elt.issubset(match2) for elt in main)) 
# False 
+0

+1 Мне тоже нравится. Легко следить за тем, что происходит. –

+0

Я опубликовал небольшое изменение в вашем ответе http://stackoverflow.com/questions/4418008/best-way-to-match-these-string-or-list/4418219#4418219 – jfs

1

Вот вариация на @unutbu's answer:

>>> main = ['123', '147', '159', '258', '369', '357', '456', '789'] 
>>> match1 = '1374' 
>>> match2 = '1892' 
>>> any(map(set(match1).issuperset, main)) 
True 
>>> any(map(set(match2).issuperset, main)) 
False 

Где map = itertools.imap

+0

+1: очень красноречиво. – unutbu

Смежные вопросы