Поиск в списке, чтобы увидеть, если он содержит строки, хранящиеся в другом списке в python - PullRequest
1 голос
/ 28 апреля 2020

У меня есть список слов в одном списке (word_list), и я создал другой список, который является просто строкой заголовков статей (headline_col). Заголовки - это строки из многих слов, а список слов - это отдельные слова. Я хочу найти заголовки, чтобы увидеть, содержат ли они какое-либо из слов в моем списке слов, и, если да, добавить еще один список (slam_list) с заголовком.

Я посмотрел это и все Я вижу, совпадают только точные строки с другой же. Например, посмотреть, является ли запись «яблоком», а не «Джон съел яблоко сегодня».

Я пытался использовать наборы, но я смог получить только чтобы вернуть True, если было совпадение, я не знал, как заставить его добавить slam_list или даже просто напечатать запись. Это то, что у меня есть. Как бы я использовал это, чтобы получить то, что мне нужно?

import csv

word_list = ["Slam", "Slams", "Slammed", "Slamming",
             "Blast", "Blasts", "Blasting", "Blasted"]

slam_list = []
csv_data = []

# Creating the list I need by opening a csv and getting the column I need
with open("website_headlines.csv", encoding="utf8") as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        data.append(row)

headline_col = [headline[2] for headline in csv_data]

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Таким образом, использование наборов, как вы упомянули, определенно способ go здесь. Это потому, что поиск в наборах намного быстрее, чем в списках. Если вы хотите знать, почему, сделайте быстрый поиск в Google по хэшированию. Все, что вам нужно сделать, чтобы сделать это изменение, это заменить квадратные скобки в word_list на фигурные скобки.

Реальная проблема, с которой вам нужно разобраться, это «Заголовки - это строки из многих слов, в то время как word_list - одиночные». words "

Что вам нужно сделать, это перебрать много слов. Я предполагаю, что headline_col - это список заголовков, где заголовок - это строка, содержащая одно или несколько слов. Мы будем повторять все заголовки, а затем повторять каждое слово в заголовке.

word_list = {"Slam", "Slams", "Slammed", "Slamming", "Blast", "Blasts", "Blasting", "Blasted"}

# Iterate over each headline
for headline in headline_col:

    # Iterate over each word in headline
    # Headline.split will break the headline into a list of words (breaks on whitespace)
    for word in headline.split():

        # if we've found our word
        if word in word_list:
            # add the word to our list
            slam_list.append(headline)
            # we're done with this headline, so break from the inner for loop
            break
0 голосов
/ 28 апреля 2020

Здесь, поскольку вы читаете CSV, вероятно, будет проще использовать pandas для достижения sh ваших целей.

Что вы хотите сделать, это идентифицировать столбец по его индексу , который выглядит как 2. Тогда вы найдете значения третьего столбца, которые находятся в word_list.

import pandas as pd

df = pd.read_csv("website_headlines.csv")
col = df.columns[2]
df.loc[df[col].isin(word_list), col]

Рассмотрим следующий пример

import numpy as np
import pandas as pd

word_list = ["Slam", "Slams", "Slammed", "Slamming",
             "Blast", "Blasts", "Blasting", "Blasted"]

# add some extra characters to see if limited to exact matches
word_list_mutated = np.random.choice(word_list + [item + '_extra' for item in word_list], 10)

data = {'a': range(1, 11), 'b': range(1, 11), 'c': word_list_mutated}
df = pd.DataFrame(data)
col = df.columns[2]

>>>df.loc[df[col].isin(word_list), col]
    a   b               c
0   1   1           Slams
1   2   2           Slams
2   3   3   Blasted_extra
3   4   4          Blasts
4   5   5     Slams_extra
5   6   6  Slamming_extra
6   7   7            Slam
7   8   8     Slams_extra
8   9   9            Slam
9  10  10        Blasting
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...