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

#python #python-3.x #for-loop #if-statement #nested-loops

#python #python-3.x #for-цикл #if-оператор #вложенные циклы

Вопрос:

В моем коде я пытаюсь сопоставить элемент из ‘match’ со строками в списке ‘data’.

Я хочу, чтобы код просматривал первое слово в списке «совпадение», и если оно совпадает со строкой в списке данных, то оно будет добавлено в другой список. Вторая проверка, которую я хочу сделать, это проверить, совпадают ли первые 2 слова в списке ‘match’ со строками в data.

В настоящее время мой вывод дает мне только один экземпляр water12 — тогда как оба shoud были подобраны.

Пожалуйста, кто-нибудь может сообщить мне, где я могу ошибаться?

 
match =['f helo','happy hellp','floral', 'alpha','12133','water12 puppies']
data=['f we are', 'hello there', 'alpha beta','happy today is the case','112133 is it', 'floral is my fave', 'water12 if healthy','water12 puppies are here and exist']

lst=[]
for i in match:
    for j in data:
        if i.split()[0] in j:
            lst.append(j)
            data.remove(j)
            break
        if len(i) > 1:
            k= ' '.join(i.split()[:2])
            if k in j:
                lst.append(j) 
                data.remove(j)
                break
                
    else:
        lst.append(i   ' - not found')

print(lst)
  

Желаемый результат:

 output= [ 'f we are', 'alpha beta','happy today is the case','112133 is it', 'floral is my fave', 'water12 if healthy','water12 puppies are here and exist']
  

Ответ №1:

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

Это должно быть что-то вроде:

 lst = []
for i in match:
    has_match = False
    for j in data:
        if i.split()[0] in j:
            has_match = True
            print(i, j)
            if j not in lst:
                lst.append(j)
        if len(i) > 1:
            k = ' '.join(i.split()[:2])
            if k in j:
                has_match = True
                print(i, j)
                if j not in lst:
                    lst.append(j)
    if not has_match:
        lst.append(i   ' - not found')
  

Я также удалил break ключевые слова, поскольку они могут помешать вашему коду находить совпадения в нескольких строках data . Использование логического значения должно выполнить эту работу. Дайте нам знать, если у вас возникнут дополнительные вопросы.

Комментарии:

1. большое вам спасибо! Я понятия не имел, что вы могли бы это сделать, и это будет очень полезно в будущем.

2. хммм, может быть, у вас есть float внутри одного из ваших списков?

3. извините, да! У меня был ‘nan’, который я удалил. еще раз спасибо!

4. Вы можете добавить a print(i, j) сразу после has_match=True .

5. На самом деле вы можете добавить оба элемента в список, создав список кортежей. Вы можете создать пустой список data = [] , а затем заменить print оператор на data.append((i, j)) . В конце вашего кода, если вы хотите pandas.DataFrame , вы можете просто сделать dataframe = pandas.DataFrame(data, columns=['Pattern', 'Matched String']

Ответ №2:

Попробуйте понять список:

 output = [x for x in data if any(True if z in x else False for z in x for y in match)]
  

Комментарии:

1. спасибо, но это не сработало — я получил ['hello there', 'water12 puppies are here and exist'] неверный результат