#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