判断一个列表是否属于另外一个列表
开始的想法时用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 回复 1# bxfqing
只针对你的标题, 我觉得用 set 可能会很容易吧? 只人判断 子集 就可以了.
但你问题中的连续数字, 我没搞明白的时, 你为啥不把它们变成数字, 而是弄些字符串在操作呢?
回复 2# q1208c
谢谢你的提议,我使用你的方法试试 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: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个的
比较笨的方法,欢迎指点: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结果: [, , ] 回复 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)
谢谢大家的帮助,我慢慢试试每种写法
页:
[1]