Помощь в написании функции

Marina10

Новичок
Пользователь
Апр 29, 2020
12
0
1
Если у меня есть 2 списка list1 = [['abc', 'bcd', 'cdn']] и list2 = [ ['abc', 'acd', 'cdn'], ['abc', 'ckd', 'cdp'], ] существует ли какой- нибуди способ сравнить элементы в списках и return тот список где элементы больше схожи между собой. То есть в данном случае элементы из списка list1 наиболее схожи с элементами из списка list2[0], соответственно функция должна вывести список ['abc', 'acd', 'cdn']
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример (считает количество одинаковых элементов в списках и выводит элемент с большим числом совпадений):
Python:
list1 = ['abc', 'bcd', 'cdn']
list2 = [['abc', 'acd', 'cdn'], ['abc', 'ckd', 'cdp']]
x = None
for i, item in enumerate(list2):
    # количество совпадающих элементов в списках
    y = len(set(item) & set(list1))
    if i == 0:
        x = (y, i)
    elif y > x[0]:
        x = (y, i)

print(list2[x[1]])
 
  • Мне нравится
Реакции: Student и Marina10

alext

Популярный
Пользователь
Май 10, 2020
288
66
28
Если у меня есть 2 списка list1 = [['abc', 'bcd', 'cdn']] и list2 = [ ['abc', 'acd', 'cdn'], ['abc', 'ckd', 'cdp'], ] существует ли какой- нибуди способ сравнить элементы в списках и return тот список где элементы больше схожи между собой. То есть в данном случае элементы из списка list1 наиболее схожи с элементами из списка list2[0], соответственно функция должна вывести список ['abc', 'acd', 'cdn']
Гугли про "расстояние Левенштейна".
 
  • Мне нравится
Реакции: Student и Marina10

Marina10

Новичок
Пользователь
Апр 29, 2020
12
0
1
Вот пример (считает количество одинаковых элементов в списках и выводит элемент с большим числом совпадений):
Python:
list1 = ['abc', 'bcd', 'cdn']
list2 = [['abc', 'acd', 'cdn'], ['abc', 'ckd', 'cdp']]
x = None
for i, item in enumerate(list2):
    # количество совпадающих элементов в списках
    y = len(set(item) & set(list1))
    if i == 0:
        x = (y, i)
    elif y > x[0]:
        x = (y, i)

print(list2[x[1]])


У меня при использовании этой функции выходит ошибка unhashable type: 'list' .Не могли бы вы мне подсказать из-за чего это происходит и как это можно исправить?
Код выглядит сейчас вот так( он разбивает неправильно написанное слово на триграммы и разбивает на триграммы слова из словаря, цель найти список триграм которые наиболее подходят к неправильно написанному слову)

Python:
misspelled_words=['Kintergarten'] #неправильно написанное слово
import nltk
from nltk.util import ngrams
def word_grams(words, min=3, max=4): #разбивает слово на список триграм
    s = []
    for n in range(min, max):
        for ngram in ngrams("#" + words.lower() + "$", n):
            s.append(''.join(str(i) for i in ngram))
    return s


def misspelled_list(misspelled_words):
    new_list = []
    for words in misspelled_words:
        new_list.append(word_grams(words))
    return new_list

print(misspelled_list(misspelled_words))

wortschatz1 = ['Kindergarten','Kinder', 'Garten'] #vocabulary c правильно написанными словами

def correct_list(wortschatz1):
    new_list1 = []
    for words in wortschatz1:
        new_list1.append(word_grams(words))
    return new_list1

print(correct_list(wortschatz1))

def convert(list):
    return tuple(i for i in list)

new_tuple = convert(correct_list(wortschatz1))
new_tuple1 = convert(misspelled_list(misspelled_words))

x = None
for i, item in enumerate(new_tuple):
    y = len(set(item) & set(new_tuple1))
    if i == 0:
        x = (y, i,)
    elif y > x[0]:
        x = (y, i,)

print(new_tuple[x[1]])
 
Последнее редактирование модератором:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
У меня при использовании этой функции выходит ошибка unhashable type: 'list' .Не могли бы вы мне подсказать из-за чего это происходит и как это можно исправить?
Код вставляйте через кнопку ... -> код -> python.
В этой строке:
Python:
y = len(set(item) & set(new_tuple1))
нужно заменить new_tuple1 на new_tuple1[0].
 
  • Мне нравится
Реакции: Marina10

Форум IT Специалистов