Сравнение двух списков кортежей с использованием ключевого слова IN

#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]