免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6978 | 回复: 7
打印 上一主题 下一主题

判断一个列表是否属于另外一个列表 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-19 14:48 |只看该作者 |倒序浏览
开始的想法时用issubset函数,但是这个不符合我的需求
我的需求是这样,有一组数字,比如 1,3,5,7,8,9,10,30,70,71,100
从小到大排列的,然后我要挑选出来连续的数字,
2个连续:7,8
三个连续:7,8,9

issubset会一口气都匹配成功 :wink:
所以我就用了下面这个
if ''.join([str(x) for x in checklist]) in ''.join([str(x) for x in continuelist]):
但是写法也有问题,居然会认为8158 8168是连续的数字。。。。
ERROR: >>> count: 5 floor ['8158', '8168']

有什么更好的方法完成这个功能吗?




参考代码如下
  1. import urllib, urllib2, cookielib,re
  2. import sys,os,random
  3. import mimetypes
  4. import mimetools
  5. import codecs
  6. import platform
  7. import time
  8. import datetime
  9. import pdb
  10. import getopt
  11. from urllib2 import HTTPError, URLError
  12. reload(sys)
  13. sys.setdefaultencoding('utf8')

  14. continuelist =[]
  15. target_list = ['8086', '8143', '8145', '8149', '8158', '8168', '8174', '8177', '8181', '8188', '8190', '8195', '8203', '8207', '8209', '8211', '8213', '8217', '8224', '8229', '8444', '8453', '8456', '8458', '8462', '8471', '8475', '8481', '8490', '8496', '8507', '8518', '8529', '8538', '8559', '8574', '8591', '8606', '8620', '8950', '8959', '8963', '8970', '8975', '8980', '8984', '8988', '8991', '8996', '9001', '9003', '9011', '9024', '9032', '9048', '9059', '9072', '9084', '9092', '9415', '9419', '9424', '9426', '9432', '9435', '9439', '9445', '9447', '9451', '9454', '9456', '9461', '9463', '9468', '9471', '9477', '9481', '9487', '9490', '9605', '9608', '9677', '9680', '9682', '9689', '9693', '9697', '9699', '9701', '9705', '9709', '9713', '9717', '9720', '9723', '9730', '9742', '9759']

  16. #print target_list
  17. con_num = 2
  18. #for i in range(int(target_list[0]),int(target_list[-1])+1):
  19. for i in range(int(target_list[0]),int(target_list[-1])+1):
  20.     continuelist.append(str(i))
  21. print continuelist
  22. for items in range(len(target_list)):
  23.     checklist = target_list[items:items+int(con_num)]
  24.     if len(checklist) < int(con_num):
  25.         #print 'Skip',checklist
  26.         continue
  27.     if set(checklist).issubset(set(continuelist)):
  28.     #if ''.join([str(x) for x in checklist]) in ''.join([str(x) for x in continuelist]):
  29.         print u'ERROR: >>> count:',items+1,u'floor',checklist
复制代码

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-08-19 16:49 |只看该作者
回复 1# bxfqing

只针对你的标题, 我觉得用 set 可能会很容易吧? 只人判断 子集 就可以了.

但你问题中的连续数字, 我没搞明白的时, 你为啥不把它们变成数字, 而是弄些字符串在操作呢?
   

论坛徽章:
0
3 [报告]
发表于 2014-08-19 18:09 |只看该作者
回复 2# q1208c


    谢谢你的提议,我使用你的方法试试

论坛徽章:
0
4 [报告]
发表于 2014-08-22 16:38 |只看该作者
  1. s= [1,3,4,5,66,88]
  2. childList = [s[i:i+n] for i in range(len(s)) for n in range(1, len(s)-i+1)]
  3. for child in childList:
  4.         if len(child) == 2 and child[0]+1 == child[1]:
  5.                 print "两个连续的:",child

  6.         if len(child) == 3 and child[0]+1 == child[1] and child[1]+1 == child[2]:
  7.                 print '三个连续的:',child
复制代码

论坛徽章:
11
2015年迎新春徽章
日期:2015-03-04 09:55:282017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之辽宁
日期:2016-12-15 10:24:1715-16赛季CBA联赛之佛山
日期:2016-11-30 09:04:2015-16赛季CBA联赛之江苏
日期:2016-04-29 15:56:1215-16赛季CBA联赛之同曦
日期:2016-04-12 13:21:182016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之山东
日期:2016-02-16 11:37:52每日论坛发贴之星
日期:2016-02-07 06:20:00程序设计版块每日发帖之星
日期:2016-02-07 06:20:0015-16赛季CBA联赛之新疆
日期:2018-01-09 16:25:37
5 [报告]
发表于 2014-08-27 12:17 |只看该作者
本帖最后由 bskay 于 2014-08-27 12:29 编辑

傻了....

if ','.join([str(x) for x in checklist]) in ','.join([str(x) for x in continuelist]):


ls = map(int, target_list)
ret = []
part = []
for d in ls:
        if len(part) == 0:
                part.append(d)
                continue
        if part[-1]+1 == d:
                part.append(d)
                continue
        if len(part) < 2:
                part = []
                continue
        ret.append(part)
        part = []
       
#2个的
[a for a in ret if len(a) == 2]
#3个的
[a for a in ret if len(a) == 3]

论坛徽章:
0
6 [报告]
发表于 2014-09-16 11:15 |只看该作者
比较笨的方法,欢迎指点:
  1. target_list = ['8140', '8143', '8144', '8149', '8158', '8159', '8160', '8160', '8181', '8188', '8190', '8195', '8203', \
  2.                '8207', '8209', '8211', '8213', '8217', '8224', '8229', '8444', '8453', '8456', '8458', '8462', '8471', \
  3.                '8475', '8481', '8490', '8496', '8507', '8518', '8529', '8538', '8559', '8574', '8591', '8606', '8620', \
  4.                '8950', '8959', '8963', '8970', '8975', '8980', '8984', '8988', '8991', '8996', '9001', '9002', '9003', \
  5.                '9024', '9032', '9048', '9059', '9072', '9084', '9092', '9415', '9419', '9424', '9426', '9432', '9435', \
  6.                '9439', '9445', '9447', '9451', '9454', '9456', '9461', '9463', '9468', '9471', '9477', '9481', '9487', \
  7.                '9490', '9605', '9608', '9677', '9680', '9682', '9689', '9693', '9697', '9699', '9701', '9705', '9709', \
  8.                '9713', '9717', '9720', '9723', '9730', '9742', '9759']

  9. def findAllContinuousSubList(originalList = None):
  10.     if originalList is None:
  11.         originalList = []

  12.     target_list = [int(i) for i in originalList]
  13.     new_list=[]
  14.     new_sub_list = []
  15.     for i in range(0,len(target_list)-1):
  16.         if target_list[i]-target_list[i+1]==-1:
  17.             new_sub_list.append(target_list[i])
  18.         elif target_list[i]-target_list[i+1]!=-1 and target_list[i-1] in new_sub_list:
  19.             new_sub_list.append(target_list[i])
  20.             new_list.append(new_sub_list)
  21.             new_sub_list = []
  22.     return new_list
复制代码
结果: [[8143, 8144], [8158, 8159, 8160], [9001, 9002, 9003]]

论坛徽章:
0
7 [报告]
发表于 2014-09-16 11:42 |只看该作者
回复 4# huangxiaohen
强大, 但是如果list很大的话这个可能对内存消耗优点大,不妨试下iterator
  1. def findAllContinuousSubListThroughIter(s):
  2.     s = [int(i) for i in s]
  3.     import itertools

  4.     # iterator for two continuous sublists
  5.     sub_list_com_2 = itertools.combinations(s, 2)
  6.     for sub_list in sub_list_com_2:
  7.         if sub_list[0]-sub_list[1]==-1:
  8.             print ">>> 两个连续: %s" %list(sub_list)

  9.     # iterator for three continuous sublists
  10.     sub_list_com_3 = itertools.combinations(s, 3)
  11.     for sub_list in sub_list_com_3:
  12.         if sub_list[0]-sub_list[1]==-1 and sub_list[1]-sub_list[2]==-1:
  13.             print ">>> 三个连续: %s" %list(sub_list)
复制代码

论坛徽章:
0
8 [报告]
发表于 2014-10-09 13:55 |只看该作者
谢谢大家的帮助,我慢慢试试每种写法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP