2016-09-21 78 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)) 
相关问题