2017-10-20 30 views
-2

您好,所以我期望用def,find等等簡單的東西來構建這個python函數,至此我知道如何獲得代碼的第一部分。根據特定需求重新排列字符串

給定一個字符串,如「HELLODOGMEMEDOGPAPA」,我將需要返回給了我三件事情的清單:

一切字狗它,直到出現的狗,我會記爲before_dog 字狗再次dog_todog前 第二次出現狗之後的所有內容都將由after_todog 表示。列表將以[before_dog,dog_todog,after_todog]的形式表示。

因此,例如給予( 「HELLODOGMEMEDOGPAPADD」),這將返回列表 ( 「HELLO」, 「DOGMEME」, 「DOGPAPADD」)

另一個例子是( 「HEYHELLOMANDOGYDOGDADDY」)將返回列表 ( 「HEYHELLOMAN」, 「DOGY」, 「DOGDADDY」)

但如果我有( 「HEYHELLODOGDADDY」) 輸出將是( 「HEYHELLO」, 「DOGDADDY」, 「」)

此外,如果狗從不出現(「HEYHELLOYO」),那麼輸出將是(「HEYHELLOYO」,「」,「」)

這是我到目前爲止有:

def split_list(words): 
    # declare the list 
    lst = [] 
    # find the first position 
    first_pos=words.find("DOG") 
    # find the first_pos 
    before_dog = words [0:first_pos] 
    lst.append(before_dog) 
    return lst 
+0

應該是區分大小寫? – RomanPerekhrest

+0

沒有不必區分大小寫 – KMAN

+1

upvote for doggos n puppers – wim

回答

1

滑稽功能split_2_dogs()re.findall()功能:

import re 

def split_2_dogs(s): 
    if s.count('DOG') == 2: # assuring 2 dogs are "walking" there 
     return list(re.findall(r'^(.*)(DOG.*)(DOG.*)$', s)[0]) 

print(split_2_dogs("HELLODOGMEMEDOGPAPADD")) 
print(split_2_dogs("HEYHELLOMANDOGYDOGDADDY")) 

輸出:

['HELLO', 'DOGMEME', 'DOGPAPADD'] 
['HEYHELLOMAN', 'DOGY', 'DOGDADDY'] 

與替代解決方案210個str.rfind()功能:

def split_2_dogs(s): 
    if 'DOG' not in s: return [s,''] 
    pos1, pos2 = s.index('DOG'), s.rfind('DOG') 
    return [s[0:pos1], s[pos1:pos2], s[pos2:]] 
+0

是否有可能做到這一點,沒有任何ifs,只是切片或導入 – KMAN

+0

@KirusanS,是的,看到我的更新 – RomanPerekhrest

+0

嘿羅馬所以如果我想這樣做,如果我想第一次看起來狗總是在第二部分的名單,即使只有一次狗出現在給定的字符串? – KMAN

0

分裂在DOG是關鍵!!此代碼將適用於您提到的所有情況。

from itertools import izip_longest 

words = 'HEYHELLODOGDADDY' 
words = words.split("DOG") 
words = ['DOG'+j if i>0 else j for i,j in enumerate(words)] 
# words = ['HEYHELLO', 'DOGDADDY'] 
ans = ['','',''] 
# stitch words and ans together 
ans = [m+n for m,n in izip_longest(words,ans,fillvalue='')] 

print ans 

輸出:

['HEYHELLO', 'DOGDADDY', ''] 
+0

我的**最後**更新如果狗第二次沒有出現,我該怎麼辦?那麼我只是得到一個錯誤 – KMAN

+0

@KirusanS所以你說的'HELLODOGPAPA'的答案應該是'('HELLO','DOGPAPA','')' – Miraj50

+0

是的,這是它應該是什麼,如果有第二次發生的字符串狗然後包括第二次發生狗後的一切將是列表的第三部分 – KMAN

0

這是很容易使用split函數來完成。例如,您可以通過一個分隔符拆分任意字符串,像狗,像這樣:

>>> chunks = 'HELLODOGMEMEDOGPAPA'.split('DOG') 
>>> print(chunks) 
['HELLO', 'MEME', 'PAPA'] 

然後,您可以使用的,輸出的list comprehension,像這樣:

>>> dog_chunks = chunks[:1] + ["DOG" + chunk for chunk in chunks[1:]] 
>>> print(dog_chunks) 
['HELLO', 'DOGMEME', 'DOGPAPA'] 

只有輕微棘手的一點是確保你不要把狗放在列表中的第一個字符串,因此slicing的小部分。

0

Split字符串以 '狗' 和使用條件,以得到期望的結果

s = 'HELLODOGMEMEDOGPAPADD' 
l = s.split('DOG') 
dl = ['DOG'+i for i in l[1:]] 
[l[0]]+dl if l[0] else dl 

輸出:

['HELLO', 'DOGMEME', 'DOGPAPADD']