bxfqing 发表于 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() in ''.join():
但是写法也有问题,居然会认为8158 8168是连续的数字。。。。
ERROR: >>> count: 5 floor ['8158', '8168']

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




参考代码如下import urllib, urllib2, cookielib,re
import sys,os,random
import mimetypes
import mimetools
import codecs
import platform
import time
import datetime
import pdb
import getopt
from urllib2 import HTTPError, URLError
reload(sys)
sys.setdefaultencoding('utf8')

continuelist =[]
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']

#print target_list
con_num = 2
#for i in range(int(target_list),int(target_list[-1])+1):
for i in range(int(target_list),int(target_list[-1])+1):
    continuelist.append(str(i))
print continuelist
for items in range(len(target_list)):
    checklist = target_list
    if len(checklist) < int(con_num):
      #print 'Skip',checklist
      continue
    if set(checklist).issubset(set(continuelist)):
    #if ''.join() in ''.join():
      print u'ERROR: >>> count:',items+1,u'floor',checklist

q1208c 发表于 2014-08-19 16:49

回复 1# bxfqing

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

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

bxfqing 发表于 2014-08-19 18:09

回复 2# q1208c


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

huangxiaohen 发表于 2014-08-22 16:38

s=
childList = for i in range(len(s)) for n in range(1, len(s)-i+1)]
for child in childList:
        if len(child) == 2 and child+1 == child:
                print "两个连续的:",child

        if len(child) == 3 and child+1 == child and child+1 == child:
                print '三个连续的:',child

bskay 发表于 2014-08-27 12:17

本帖最后由 bskay 于 2014-08-27 12:29 编辑

傻了....

if ','.join() in ','.join():


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个的

#3个的

lizhihui_kevin 发表于 2014-09-16 11:15

比较笨的方法,欢迎指点:target_list = ['8140', '8143', '8144', '8149', '8158', '8159', '8160', '8160', '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', '9002', '9003', \
               '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']

def findAllContinuousSubList(originalList = None):
    if originalList is None:
      originalList = []

    target_list =
    new_list=[]
    new_sub_list = []
    for i in range(0,len(target_list)-1):
      if target_list-target_list==-1:
            new_sub_list.append(target_list)
      elif target_list-target_list!=-1 and target_list in new_sub_list:
            new_sub_list.append(target_list)
            new_list.append(new_sub_list)
            new_sub_list = []
    return new_list结果: [, , ]

lizhihui_kevin 发表于 2014-09-16 11:42

回复 4# huangxiaohen
:D 强大, 但是如果list很大的话这个可能对内存消耗优点大,不妨试下iteratordef findAllContinuousSubListThroughIter(s):
    s =
    import itertools

    # iterator for two continuous sublists
    sub_list_com_2 = itertools.combinations(s, 2)
    for sub_list in sub_list_com_2:
      if sub_list-sub_list==-1:
            print ">>> 两个连续: %s" %list(sub_list)

    # iterator for three continuous sublists
    sub_list_com_3 = itertools.combinations(s, 3)
    for sub_list in sub_list_com_3:
      if sub_list-sub_list==-1 and sub_list-sub_list==-1:
            print ">>> 三个连续: %s" %list(sub_list)

bxfqing 发表于 2014-10-09 13:55

谢谢大家的帮助,我慢慢试试每种写法
页: [1]
查看完整版本: 判断一个列表是否属于另外一个列表