#python #python-3.x
#python #python-3.x
Вопрос:
У меня есть два списка кортежей, оба в формате (integer, string)
.
Первый список является подмножеством второго списка, и мне нужны только элементы второго списка, которые разделяют целое число с первым. Например
Список 1:
int string
==============
1 string1
3 string2
5 string3
Список 2:
int string
===================
1 otherstring1
2 otherstring2
3 otherstring3
4 otherstring4
5 otherstring5
тогда я хочу, чтобы мой результат был
int string
===================
1 otherstring1
3 otherstring3
5 otherstring5
Есть ли способ сделать это, используя IN
ключевое слово? С использованием python 3.7.
Ответ №1:
Создайте набор целых чисел, присутствующих в list1:
integers_in_list_one = {tup[0] for tup in list1}
Затем вы можете сделать
common = [tup for tup in list2 if tup[0] in integers_in_list_one]
Почему set?
Поскольку наборы обеспечивают поиск O (1), используя набор, мы достигаем решения с временной сложностью O (n) вместо O (n ^ 2).
Полный пример:
list_1 = [(1, 'string1'), (3, 'string2'), (5, 'string3')]
list_2 = [(1, 'otherstring1'), (2, 'otherstring2'), (3, 'otherstring3'), (4, 'otherstring4'), (5, 'otherstring5')]
integers_in_list_one = {tup[0] for tup in list_1}
common = [tup for tup in list_2 if tup[0] in integers_in_list_one]
print(common)
Выводит
[(1, 'otherstring1'), (3, 'otherstring3'), (5, 'otherstring5')]
Ответ №2:
Начальный ответ :
output = [a,b for a,b in list_2 if a in [a for a,b in list_1]]
Использование set для эффективности хэширования:
output = [a,b for a,b in list_2 if a in set([a for a,b in list_1])]
Комментарии:
1. Это не самый удобный способ записи, и внутренний список создается
len(list_2)
раз, что неэффективно. (Редактировать: даже с отредактированным решением проблема все еще присутствует)
Ответ №3:
Предположим, что два списка — это list1
и list2
. Мы начинаем с извлечения целых чисел из list1
:
integers = {x for x,y in list1}
Здесь {
и }
используются для создания набора вместо списка (потому что поиск в наборе выполняется быстрее, чем в списке).
Затем мы перебираем элементы в list2
и сохраняем только строки, номер которых находится в integers
:
strings = [y for x,y in list2 if x in integers]