#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 = []
, а затем заменить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']
неверный результат