Python中raw_input()輸入都是按字符串類型,因此梳理一下字符串分割、連接、刪除的split(),join(),strip()函數。
另外聯想到之前的網易筆試題 迴文序列,在輸入部分用到了split()。
split()函數:
Python中有split()和os.path.split()兩個函數,具體作用如下:
split():拆分字符串。通過指定分隔符對字符串進行切片,並返回分割後的字符串列表(list)
os.path.split():按照路徑將文件名和路徑分割開
語法:str.split(str="",num=string.count(str))[n]
參數說明:
str: 表示爲分隔符,默認爲空格,但是不能爲空('')。若字符串中沒有分隔符,則把整個字符串作爲列表的一個元素
num:表示分割次數。如果存在參數num,則僅分隔成 num+1 個子字符串,並且每一個子字符串可以賦給新的變量
[n]: 表示選取第n個分片
實例:
>>> u = "www.doiido.com.cn"
#使用默認分隔符
>>> print u.split()
['www.doiido.com.cn']
#以"."爲分隔符
>>> print u.split('.')
['www', 'doiido', 'com', 'cn']
#分割0次
>>> print u.split('.',0)
['www.doiido.com.cn']
#分割一次
>>> print u.split('.',1)
['www', 'doiido.com.cn']
#分割兩次
>>> print u.split('.',2)
['www', 'doiido', 'com.cn']
#分割兩次,並取序列爲1的項,而[0]表示取其第一個元素,[::-1]按反序列排列,[::]安正序排列,[:-1]從首個元素開始到次末尾,最後一個元素刪除掉。
>>> print u.split('.',2)[1]
doiido
#分割最多次(實際與不加num參數相同)
>>> print u.split('.',-1)
['www', 'doiido', 'com', 'cn']
#分割兩次,並把分割後的三個部分保存到三個文件
>>> u1,u2,u3 = u.split('.',2)
>>> print u1
www
>>> print u2
doiido
>>> print u3
com.cn
#
#去除換行符,輸出爲列表
>>> c = '''say
hello
baby'''
>>> print c
say
hello
baby
>>> print c.split('\n')
['say', 'hello', 'baby']
另外提及os.path.split()函數
語法:os.path.split('PATH')
參數說明:
- PATH指一個文件的全路徑作爲參數:
- 如果給出的是一個目錄和文件名,則輸出路徑和文件名
- 如果給出的是一個目錄名,則輸出路徑和爲空文件名
>>> import os
>>> print os.path.split('/dodo/soft/python/')
('/dodo/soft/python', '')
>>> print os.path.split('/dodo/soft/python')
('/dodo/soft', 'python')
一個實例:>>> str="hello boy<[www.doiido.com]>byebye"
>>> print str.split("[")[1].split("]")[0]
www.doiido.com
>>> print str.split("[")[1].split("]")[0].split(".")
['www', 'doiido', 'com']
join(): 連接字符串數組。將字符串、元組、列表中的元素以指定的字符(分隔符)連接生成一個新的字符串
os.path.join(): 將多個路徑組合後返回
- >>> seq1 = ['hello','good','boy','doiido']
- >>> print ' '.join(seq1)
- hello good boy doiido
- >>> print ':'.join(seq1)
- hello:good:boy:doiido
- >>> seq2 = "hello good boy doiido"
- >>> print ':'.join(seq2)
- h:e:l:l:o: :g:o:o:d: :b:o:y: :d:o:i:i:d:o
- >>> seq3 = ('hello','good','boy','doiido')
- >>> print ':'.join(seq3)
- hello:good:boy:doiido
- >>> seq4 = {'hello':1,'good':2,'boy':3,'doiido':4}
- >>> print ':'.join(seq4)
- boy:good:doiido:hello
- >>> import os
- >>> os.path.join('/hello/','good/boy/','doiido')
- '/hello/good/boy/doiido'
python strip()函數
s爲字符串,rm爲要刪除的字符序列
s.strip(rm) 刪除s字符串中開頭、結尾處,位於 rm刪除序列的字符
s.lstrip(rm) 刪除s字符串中開頭處,位於 rm刪除序列的字符
s.rstrip(rm) 刪除s字符串中結尾處,位於 rm刪除序列的字符
(1)當rm爲空時,默認刪除空白符(包括'\n', '\r', '\t', ' ')
>>> a = ' 123'
>>> a
' 123'
>>> a.strip()
'123'
(2)這裏的rm刪除序列是隻要邊(開頭或結尾)上的字符在內,就刪除掉。
- >>> a = '123abc'
- >>> a.strip('21')
- '3abc'
- >>> a.strip('12')
- '3abc'
-
>>> a='123abc31'
>>> a.strip('12')
'3abc3'
迴文序列
如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列爲迴文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。
現在給出一個數字序列,允許使用一種轉換操作:
選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。
現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列。
輸入描述:
輸入爲兩行,第一行爲序列長度n ( 1 ≤ n ≤ 50)
第二行爲序列中的n個整數item[i] (1 ≤ iteam[i] ≤ 1000),以空格分隔。
輸出描述:
輸出一個數,表示最少需要的轉換次數
輸入例子:
4
1 1 1 3
輸出例子:
2
思路(Key):要形成迴文,要不然最左與最右相等,要不然取相鄰的和代替之前的兩個數,最終達到左右一定兩邊對稱相等(包含只剩一個最後的和這一情況)--也是遞歸結束的條件。1、序列首尾相等,刪除二者;
2、若新生成的首尾不相等,將剩下數以最小數升序形式(設想要有可能左右相等,數必須按從小到大順序排列),以最小數和相鄰數相加,以該個和值遞歸上述的判斷。
def dealHuiwen(li,count=0):
leng = len(li)
if leng>1: #結束條件
last=leng-1
if li[0]==li[last]:
del li[0]
del li[last-1]#此時li[last]在li[last-1]的位置
count = dealHuiwen(li,count)#簡化後,再進行遞歸處理
else:
if li[0]>li[last]:
li.reverse()#逆序,總是將最小的放在最前
li[0]=li[0]+li[1]
del li[1]
count+=1
count=dealHuiwen(li,count)
return count
if __name__ == '__main__':
num=input() #輸入數據,在python2.x中用raw_input()
string=input() #輸入數據,在python2.x中用raw_input()
li=string.split(' ')
for i in range(0,int(num)):
li[i]=int(li[i])#轉化爲int
print(dealHuiwen(li))
另一個做法;判斷過程中 不刪除序列數據,設置序列首尾指針,同樣可以達到迴文序列。
#-*- coding:utf8 -*-
def getNum(item, left, right, head, tail, time):
if head >= tail:
return time
if left < right:
head, time = head+1, time+1
left += item[head]
elif left > right:
tail, time = tail-1, time+1
right += item[tail]
else:
head, tail = head+1, tail-1
left, right = item[head], item[tail]
return getNum(item, left, right, head, tail, time)
if __name__ == '__main__':
n = input() #這裏一定用input
item = map(int, raw_input().split())
head, tail = 0, n-1
start, end = item[head], item[tail]
print getNum(item, start, end, head, tail, 0)
tip:這裏用到了input( )。
raw_input() 與input()存在差別。
其中raw_input() 將所有輸入作爲字符串看待,返回字符串類型。
而 input() 在對待純數字輸入時具有自己的特性,它返回所輸入的數字的類型(int,float ).
input() 本質上還是使用 raw_input() 來實現的,只是調用完 raw_input() 之後再調用 eval() 函數,你甚至可以將表達式作爲input()的參數,它會計算表達式的值並返回。