сопоставление подстрок / сравнение списков в python

#python #string #list #python-2.7

#python #строка #Список #python-2.7

Вопрос:

У меня есть два разных списка, и мне нужно найти номер индекса списка, например, с более похожим шаблоном

 list_1=['abdsc 23h', 'nis 4hd qad', '234 apple 54f','abdsc 2300h']
list_2=['abdsc 23', 'abdsc 230']
  

сравнение должно выполняться как для списка, если элемент list_2 совпадает с list_1 , то он должен возвращать индекс list_1, где присутствует этот элемент
1. примечание: для 2-го элемента list_2 то есть abdsc 230 он должен возвращать 4, поскольку он имеет наибольшее совпадение с 4-м элементом list_1

вот код, который я пытаюсь решить

 from bs4 import BeautifulSoup
import urllib
import pandas as pd
from difflib import SequenceMatcher as SM

def maxmatching_algo2(data, counter):
    data_word=[]
    data_word=str(data).split(" ")
    k=[]
    for i in processsorList_global:
        k =str(i).split(",")
    temp=0
    rank_list=[]
    while temp<len(k):
        t=[]
        t =str(k[temp]).split(" ")
        union_set=set(t)amp;set(data_word)
        rank_list = [len(union_set)]
        temp =1
    index= rank_list.index(max(rank_list))
    if index==0:
        df1.ix[counter, cl]="na"
    else:
        df1.ix[counter, cl]=index


def processor_list_online():
    processsorList = []
    url = "http://www.notebookcheck.net/Smartphone-Processors-Benchmark-List.149513.0.html"
    htmlfile = urllib.urlopen(url)
    soup = BeautifulSoup(htmlfile, 'html.parser')
    count = 1
    temp_count=0
    x=str()
    while True:

        if x=="Qualcomm Snapdragon S1 MSM7227":
            break
        else:
            for i in soup.find_all('tr'):
                count =1
                temp=0
                for j in i.find_all('td', attrs={'class': 'specs'}):
                    if temp==1:
                        processsorList  = [j.text]
                        x=j.text
                    temp =1
                    temp_count =1


    print temp_count
    return processsorList



###############################################################################################################################

###############################################################################################################################
df1 = pd.read_csv('proddata2.csv')
x = list(df1.columns.values)  #######################     name of column
cl = len(x)  #######################     column Length
rl = len(df1.index)  #######################     row length
df1["Processor Rank"] = ""
counter = 0
count = []

processsorList_global = processor_list_online()
for i in processsorList_global:
    print i

counter=0
while counter < cl:
    if x[counter] == "processor_type":
        count = counter
        break
    counter  = 1

counter = 0
data = []
while counter < rl:
    data = df1.ix[counter, count]
    #print data
    if data=="na":
        df1.ix[counter, cl]="na"
    else:
       # maxmatching_algo(data, counter)
        maxmatching_algo2(data, counter)
    counter  =1

#print df1
#df1.to_csv('final_processor_rank.csv', sep=',')
print "process completed"
  

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

1. это написано в примечании:

2. Вы пытались решить это самостоятельно? Пожалуйста, также опубликуйте свою попытку

Ответ №1:

Один из подходов заключается в создании функции для возврата позиции sub_string из list_1 . И затем вызовите функцию для каждого элемента list_2 , используя map()

 list_1=['abdsc 23h', 'nis 4hd qad', '234 apple 54f','abdsc 2300h']
list_2=['abdsc 23', 'abdsc 230']

def get_position_from_list(item, l):
    for i, val in enumerate(l):
        if item in val:
           return i   1
    else:
        return None

map(lambda x: get_position_from_list(x, list_1), list_2)
# returns: [1, 4]
  

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

1. вместо [map(lambda x: get_index_from_list(x, list_1), list_2) ] должно быть [map(lambda x: get_position_from_list(x, list_1), list_2) ]

2. Обновил его. Наверное, я перепутал это с чьим-то другим ответом. Спасибо!

Ответ №2:

Вам нужно будет сделать что-то вроде этого:

 def compare_substrings_in_list(first_list, compared_list):
    for element in first_list:
        last_match = 0
        for idx, compared_list_element in enumerate(compared_list):
            if element in compared_list_element:
                last_match = idx   1
        return last_match
  

Где вы перебираете каждый элемент списка «поисков» и пытаетесь найти совпадения по каждому элементу второго списка, используя оператор in .

Ответ №3:

Приведенное ниже решение может сработать для вас.

 >>> for i,val in enumerate(sorted(list_2, key= len, reverse = True)):
...     for j,val2 in enumerate(list_1):
...         if val in val2:
...             print j 1
...             exit()
... 
4
  

Обратите внимание, что если у вас есть несколько совпадений, этого решения недостаточно. Но это полностью зависит от ваших вариантов использования.

На данный момент все должно быть в порядке.

Ответ №4:

Это решает вашу проблему,

 list_1=['abdsc 23h', 'nis 4hd qad', '234 apple 54f','abdsc 2300h']
list_2=['abdsc 23', 'abdsc 230']

for strings in list_2:
print "-list1val--",strings
for other in list_1:
    print '--list2val---',other
    occurence = other.find(strings);
    if occurence==0:
        ind = list_1.index(other)
        print "the index of ",strings,"in list_1 is ",ind
        break