я написал функцию для удаления ссылки на изображение из текстовых данных (строки, хранящиеся в пандах)
image_link_1 = 'â\x80¦IMAGEâ\x80¦'
image_link_2 = 'IMAGE'
def remove_image(text):
remove_im = ''.join([i for i in text if i not in image_link_1 and image_link_2])
return remove_im
df['title_and_abstract'] = df['title_and_abstract'].apply(lambda x: remove_image(x))
Проблема в том, что функция удаляет первую букву некоторой строки. Особенно кажется, что функция удаляет только заглавные буквы. Странный.
Вот пример
'Это пример строки. Вот ИЗОБРАЖЕНИЕ.
после использования функции:
'his is an example string. Here is the .'
Я действительно не понимаю, почему эта функция делает это.
Заранее спасибо!
вы пробовали оставлять пробел между ""? remove_im = ' '.join([i for i in text if i not in image_link_1 and image_link_2])
Несвязанное Примечание: вы можете (и, вероятно, должны) заменить lambda x: remove_image(x)
только на remove_image
.
@AliÜlkü да, я сделал
@РойКоэн. Спасибо за ваш ответ. Я был бы заинтересован в кратком объяснении, если вы можете уделить немного времени :)
@Epimetheus Когда вы пишете remove_image
(без круглых скобок), вы ссылаетесь на функциональный объект. Этот объект при вызове запускает тело функции. Когда вы пишете lambda x: remove_image(x)
, вы имеете в виду анонимный функциональный объект. Этот объект при вызове запускает тело лямбда-выражения, которое вызывает функцию. Таким образом, обе опции при вызове будут запускать функцию.
for i in text
разбивает текст на отдельные символы; если вам нужны слова, это будет for i in text.split()
and image_link_2
проверяет, не пусто ли image_link_2
, что всегда верно; то, что вы, вероятно, хотите, это if i not in [image_link_1, image_link_2]
Надеюсь, это поможет вам избавиться от застревания?
Спасибо за ваш быстрый ответ: Если я использую форму предложения: если я не в [image_link_1, image_link_2], ссылки вообще не удаляются.
Да, вам, вероятно, придется объединить их. Вы можете распечатать некоторые промежуточные результаты, чтобы лучше понять, что делает код...
просто потому что мне любопытно. Если нужно удалить более 10 слов, определение каждого слова как одной строки представляется невозможным. Вот почему пытался хранить больше слов в одном списке строк, но это не сработало. Ребята, есть мысли по этому поводу?
Да, вы должны иметь возможность определить список слов как список или кортеж (или, если вам нужно рассматривать их по-разному, как словарь). Тогда условие будет примерно таким: if word not in image_links
Я также новый ученик Python, поэтому я хочу объяснить ответ своими мыслями, которые могут помочь людям, которые будут смотреть ветку в будущем.
Как правильно сказано в предыдущем ответе, исходная функция повторялась только по отдельным символам (I, M, A, G, E), а не по словам (IMAGE). Это также привело к удалению всех одиночных символов, определенных в image_link_1 и 2.
text.split() решает эту проблему, поскольку исходная строка разбивается на слова, а не на символы.
Рабочий код:
def remove_link(text):
remove_im = ' '.join([i for i in text.split() if i not in [image_link_1, image_link_2]])
return remove_im
df['title_and_abstract'] = df['title_and_abstract'].apply(lambda x: remove_link(x))
Отвечает ли это на ваш вопрос? Почему `a == b или c или d` всегда оценивается как True?