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

У меня есть следующие два списка, и я пытаюсь найти общие слова между ними. Я пытаюсь извлечь слова из l2 (игнорируя число) и сохранить их в l3, но постоянно получаю сообщение об ошибке:

индексы списка должны быть целыми или кусочками, а не кортежами

Я заинтересован в исправлении или есть лучший подход к решению.

l1=['the', 'and', 'to', 'of', 'a', 'in', 'is', 'that']
l2=[('the', 637), ('of', 252), ('a', 208), ('to', 207), ('in', 147), 
    ('and', 134), ('that', 134), ('was', 133)]


l3= list(map(lambda x: set(l2[x][x]), l2[0:6]))

print(set(l1 & l3))

Ответы [ 4 ]

2 голосов
/ 08 апреля 2020

Использовать установить пересечение :

s1 = set(l1)

i = s1.intersection( e[0] for e in l2 )

print(i) # set(['a', 'and', 'that', 'of', 'to', 'in', 'the'])

Установить пересечение (метод) может потребоваться любая итерация, чтобы найти пересечение с набором, который вы вызываете.


Ваша ошибка связана с неправильным использованием лямбды:

map(lambda x: set(l2[x][x]), l2[0:6]))

каждый x является одним из элементов l2 (вы берете только первые шесть элементов l2. map принимает каждый элемент ввод повторяется и применяет предоставленную вами функцию. Для первого элемента l2 это будет:

set(l2[('the', 637)][('the', 637)]) 

, что явно неверно.

2 голосов
/ 08 апреля 2020

Вы можете использовать понимание списка и проверить, какой первый элемент кортежа содержится в l1. Вы можете уменьшить сложность операции, создав set из l1:

s1 = set(l1)

l3 = [s for s,*_ in l2 if s in s1]
# ['the', 'of', 'a', 'to', 'in', 'and', 'that']

Или мы также можем использовать zip и индексировать первый элемент:

set(l1).intersection(list(zip(*l2))[0])

Обратите внимание, что ваш подход не работает, поскольку вы пытаетесь индексировать с помощью кортежей. lambda x получает кортеж каждый раз, так как вы итерируете по l2 напрямую. Если у вас есть длина 2 подсписков, вы также можете рассмотреть возможность работы со словарями, к которым вы можете получить доступ, используя заданный ключ. Учитывая структуру ваших данных, похоже, что это может быть хорошей альтернативой для вас:

d = dict(l2)

[i for i in l1 if i in d]
# ['the', 'and', 'to', 'of', 'a', 'in', 'that']
1 голос
/ 08 апреля 2020

Чтобы исправить свой подход:

l3 = set(map(lambda x: x[0], l2))  # first element from each pair in l2

print(set(l1) & l3)  # must intersect set and set, not list and set
0 голосов
/ 08 апреля 2020

вы можете преобразовать свой список l1 в set, а затем вы можете использовать понимание списка:

l1= ['the', 'and', 'to', 'of', 'a', 'in', 'is', 'that']
l1 = set(l1)

l2=[('the', 637), ('of', 252), ('a', 208), ('to', 207), ('in', 147), ('and', 134), ('that', 134), ('was', 133)]

l3 = [t[0] for t in l2 if t[0] in l1]
...