2016-09-21 4 views
0

У меня есть глупый вопрос для людей, знакомых со списками в Python. Я хочу получить общие предметы в двух списках. Если предположить, что у меня есть этот список:Дубликаты/общие элементы между двумя списками

dates_list = ['2016-07-08 02:00:02', 
       '2016-07-08 02:00:17', 
       '2016-07-08 02:00:03', 
       '2016-07-08 02:00:20', 
       '2016-07-08 02:01:08', 
       '2016-07-08 02:00:09', 
       '2016-07-08 02:01:22', 
       '2016-07-08 02:01:33'] 

И список под названием «time_by_seconds», который содержит списки всех секунд в день:

time_by_seconds = [['2016-07-08 02:00:00', 
      '2016-07-08 02:00:01', 
      '2016-07-08 02:00:02', 
      '2016-07-08 02:00:03', 
      '2016-07-08 02:00:04', 
      '2016-07-08 02:00:05', 
      '2016-07-08 02:00:06', 
      etc     ], 
      ['2016-07-08 02:01:00', 
      '2016-07-08 02:01:01', 
      '2016-07-08 02:01:02', 
      '2016-07-08 02:01:03', 
      '2016-07-08 02:01:04', 
      etc     ]] 

Это мой код, чтобы напечатать элементы, если они в этом списке:

for item in dates_list: 
    for one_list in time_by_seconds: 
     if item in one_list: 
      print item 

Это результат:

2016-07-08 02:00:02 
2016-07-08 02:00:17 
2016-07-08 02:00:03 
2016-07-08 02:00:20 
2016-07-08 02:01:08 
2016-07-08 02:00:09 
2016-07-08 02:01:22 
2016-07-08 02:01:33 

Но если я использую другой список, с длиной 49, у меня есть дубликаты. Конкретно у меня должно быть 49 элементов, потому что все эти даты существуют в моем time_by_seconds. Это список:

beginning_time_list = ['2016-07-08 02:17:42', 
'2016-07-08 02:05:35', 
'2016-07-08 02:03:22', 
'2016-07-08 02:26:33', 
'2016-07-08 02:14:54', 
'2016-07-08 02:05:13', 
'2016-07-08 02:15:30', 
'2016-07-08 02:01:53', 
'2016-07-08 02:02:31', 
'2016-07-08 02:00:08', 
'2016-07-08 02:04:16', 
'2016-07-08 02:08:44', 
'2016-07-08 02:11:17', 
'2016-07-08 02:01:40', 
'2016-07-08 02:04:23', 
'2016-07-08 02:01:34', 
'2016-07-08 02:24:31', 
'2016-07-08 02:00:27', 
'2016-07-08 02:14:35', 
'2016-07-08 02:00:57', 
'2016-07-08 02:02:24', 
'2016-07-08 02:02:46', 
'2016-07-08 02:05:04', 
'2016-07-08 02:11:26', 
'2016-07-08 02:06:24', 
'2016-07-08 02:04:32', 
'2016-07-08 02:08:50', 
'2016-07-08 02:08:27', 
'2016-07-08 02:02:30', 
'2016-07-08 02:03:59', 
'2016-07-08 02:01:19', 
'2016-07-08 02:02:09', 
'2016-07-08 02:05:47', 
'2016-07-08 02:02:36', 
'2016-07-08 02:01:02', 
'2016-07-08 02:02:58', 
'2016-07-08 02:06:19', 
'2016-07-08 02:02:34', 
'2016-07-08 02:00:17', 
'2016-07-08 02:10:03', 
'2016-07-08 02:08:20', 
'2016-07-08 02:02:36', 
'2016-07-08 02:17:25', 
'2016-07-08 02:07:19', 
'2016-07-08 02:13:07', 
'2016-07-08 02:03:51', 
'2016-07-08 02:03:35', 
'2016-07-08 02:14:53', 
'2016-07-08 02:18:36'] 

Тот же самый код:

for item in beginning_time_list: 
    for one_list in time_by_seconds: 
     if item in one_list: 
      print item 

И это результат:

2016-07-08 02:17:42 
2016-07-08 02:17:42 
2016-07-08 02:17:42 
2016-07-08 02:17:42 
2016-07-08 02:05:35 
2016-07-08 02:05:35 
2016-07-08 02:03:22 
2016-07-08 02:26:33 
2016-07-08 02:26:33 
2016-07-08 02:26:33 
2016-07-08 02:26:33 
2016-07-08 02:26:33 
2016-07-08 02:26:33 
2016-07-08 02:14:54 
2016-07-08 02:14:54 
2016-07-08 02:14:54 
2016-07-08 02:05:13 
2016-07-08 02:05:13 
2016-07-08 02:15:30 
2016-07-08 02:15:30 
2016-07-08 02:15:30 
2016-07-08 02:15:30 
2016-07-08 02:01:53 
2016-07-08 02:02:31 
2016-07-08 02:00:08 
2016-07-08 02:04:16 
2016-07-08 02:08:44 
2016-07-08 02:08:44 
2016-07-08 02:11:17 
2016-07-08 02:11:17 
2016-07-08 02:11:17 
2016-07-08 02:01:40 
2016-07-08 02:04:23 
2016-07-08 02:01:34 
2016-07-08 02:24:31 
2016-07-08 02:24:31 
2016-07-08 02:24:31 
2016-07-08 02:24:31 
2016-07-08 02:24:31 
2016-07-08 02:00:27 
2016-07-08 02:14:35 
2016-07-08 02:14:35 
2016-07-08 02:14:35 
2016-07-08 02:00:57 
2016-07-08 02:02:24 
2016-07-08 02:02:46 
2016-07-08 02:05:04 
2016-07-08 02:05:04 
2016-07-08 02:11:26 
2016-07-08 02:11:26 
2016-07-08 02:11:26 
2016-07-08 02:06:24 
2016-07-08 02:06:24 
etc 

К сожалению есть 95 пунктов!

Кто-то знает, почему у меня есть дубликаты? Thnx

+2

Хорошо, но хранить все секунды в день в списке, кажется, не будет хорошей идеей. Разумеется, есть лучшие подходы. Чего вы на самом деле пытаетесь достичь? –

+0

Мое предположение заключается в том, что у вас есть дубликаты в 'time_by_seconds', т. Е.' 2016-07-08 02: 17: 42' в нескольких списках (которые я предполагаю, не должно быть) –

ответ

1

Как только элемент находится в одном из подписок, поиск продолжается с другими подсписками.

Вы должны рассмотреть возможность использования break, чтобы остановить поиск текущего элемента даты, когда он находится в одном из подсписков:

for item in beginning_time_list: 
    for one_list in time_by_seconds: 
     if item in one_list: 
      print item 
      break 
2

Для того, чтобы найти общие элементы в двух списках, вы можете использовать set() как:

>>> a = [1, 2, 3, 4] 
>>> b = [3, 4, 5, 6] 
>>> list(set(a).intersection(set(b))) 
[3, 4] 

в вашем случае, b список списков. Сначала нужно сгладить список. Для этого вы можете использовать itertools.chain()

>>> from itertools import chain 
>>> a = [1, 2, 3, 4] 
>>> b = [[3, 5, 6], [4, 8, 9]] 
>>> list(set(a).intersection(set(chain.from_iterable((b))))) 
[3, 4] 
+0

в вопросе b есть список из списка .... похоже на раскол за минуту .. –

+0

Обновлен ответ на списки списка, а также –

0
import collections 

def flatten(iterable): 
    for item in iterable: 
     if isinstance(item, (str, bytes)): 
      yield item 
     if isinstance(item, collections.Sequence): 
      yield from flatten(item) 
     else: 
      yield item 


a = [1, 6, 10] 
b = [[0, 1, 2], 3, [4], [5, (6, 7), 8], 9] 

common_items = set(a) & set(flatten(b)) 
Смежные вопросы