亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

急求?。。。ython列表里面根據一定的條件挑選元素各位有什么建議?

急求?。。。ython列表里面根據一定的條件挑選元素各位有什么建議?

蠱毒傳說 2019-11-03 11:17:56
我有一個list如下結構:L=["ticket1","ticket2","spec1","spec2","ticket3","ticket4","spec3","ticket5","spec4","spec5","ticket6","ticket7","ticket8","ticket9","ticket10","spec6","spec7","ticket11","ticket12","ticket13","spec8","ticket14","spec9","ticket15","ticket16","ticket17","ticket18","spec1""ticket19","ticket20","spec2""ticket21"]想要挑出來后面沒有跟著spec的ticket,具體規則如下:1.如果連續兩個ticket后面跟著連續兩個spec,那么這兩個ticket算有spec,如ticket1,ticket2;ticket9,ticket102.如果一個ticket后面跟著一個或者連續多個spec,那么這個ticket也算有spec,如ticket4,ticket5,ticket13,ticket14;剩下的ticket都算是沒有spec的,我想要挑出這些ticket,有哪些好的方法可以使用呀?沒有spec的ticket如下:ticket3,ticket6,ticket7,ticket8,ticket11,ticket12,ticket15,ticket16,ticket17,ticket19,ticket21列表里面的信息是唯一的信息,請教各位大神有什么方法可以實現這樣的挑選。
查看完整描述

2 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

應該是2*n的時間復雜度,可以按這個原理再優化成n的時間復雜度和O(1)的空間復雜度
L=["ticket1","ticket2","spec1","spec2",
"ticket3","ticket4","spec3",
"ticket5","spec4","spec5",
"ticket6","ticket7","ticket8",
"ticket9","ticket10","spec6","spec7",
"ticket11","ticket12",
"ticket13","spec8",
"ticket14","spec9"]
defcalc(l):
iflen(l)<2:
return[]
t=0
s=0
foriinl:
ifi.startswith('ticket'):
t+=1
else:
s+=1
ift>=3:
ifs>=2:
returnl[:t-2]
else:
returnl[:t-s]
elift>s:
returnl[:t-s]
return[]
defmain(L):
res=[]
start=0
fori,curr_eleinenumerate(L[:-1]):
next_ele=L[i+1]
ifcurr_ele.startswith('spec')andnext_ele.startswith('ticket'):
res.extend(calc(L[start:i+1]))
start=i+1
res.extend(calc(L[start:]))
returnres
print(main(L))
['ticket3','ticket6','ticket7','ticket8','ticket11','ticket12']
                            
查看完整回答
反對 回復 2019-11-03
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

update:之前一版是錯的,忽略了兩層棧深還必須ticket、spce連續的要求換個解法,代碼有些冗長
#!/usr/bin/envpython
#-*-coding:utf-8-*-
defis_ticket(node):
returnnode.startswith('ticket')
defis_spec(node):
returnnode.startswith('spec')
defdeal1(L):
ifL:
node=L.pop(0)#無論何種,都會使表長-1
ifis_ticket(node):
returnnode
returnNone
defdeal2(L):
defmatch_ts(L):
node1,node2=L[:2]
returnis_ticket(node1)andis_spec(node2)
iflen(L)<2:
returnFalse
elifmatch_ts(L):
del(L[:2])#表長-2
returnTrue
else:
returnFalse
defdeal4(L):
defmatch_ttss(L):
n1,n2,n3,n4=L[:4]
returnis_ticket(n1)andis_ticket(n2)andis_spec(n3)andis_spec(n4)
iflen(L)<4:
returnFalse
elifmatch_ttss(L):
del(L[:4])#表長-4
returnTrue
else:
returnFalse
deffindout_no_spec_tickets(L):
res=[]
whilelen(L):
ifdeal4(L):
continue
elifdeal2(L):
continue
ret=deal1(L)
ifret:
res.append(ret)
returnres
L=["ticket1","ticket2","spec1","spec2",
"ticket3","ticket4","spec3",
"ticket5","spec4","spec5",
"ticket6","ticket7","ticket8",
"ticket9","ticket10","spec6","spec7",
"ticket11","ticket12",
"ticket13","spec8",
"ticket14","spec9",
"ticket15","ticket16","ticket17",
"ticket18","spec1",
"ticket19",
"ticket20","spec2",
"ticket21"]
if__name__=='__main__':
res=findout_no_spec_tickets(L)
print(res)
還有個短的寫法,無非是前向判斷,濾出非'ts','ttss':
defis_ticket(node):
returnnode.startswith('ticket')
deffind(L):
length=len(L)
foriinrange(length):
ifis_ticket(L[i]):
ifi==length-1:
yieldL[i]
eliflength-4ifis_ticket(L[i+1]):
yieldL[i]
else:
ifis_ticket(L[i+1])and(is_ticket(L[i+2])
oris_ticket(L[i+3])):
yieldL[i]
if__name__=='__main__':
print(list(find(L)))
--------------------------------before---------------------------------------
用棧是最優的
deffindout_no_spect(L):
defis_ticket(s):returns.startswith("ticket")
defis_spec(s):returns.startswith("spec")
no_spec_tickets=[]
stack=[]
foriinL:
ifstackandis_spec(i):stack.pop()
ifis_ticket(i):stack.append(i)
iflen(stack)>2:no_spec_tickets.append(stack.pop(0))
no_spec_tickets.extend(stack)
returnno_spec_tickets
輸出
>>>find_no_spect(L)
['ticket6','ticket7','ticket8','ticket11','ticket12']
                            
查看完整回答
反對 回復 2019-11-03
  • 2 回答
  • 0 關注
  • 629 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號