這段時間參加了幾個公司的在線筆試抵知,發(fā)現(xiàn)了一個很有意思的現(xiàn)象墙基,因為不同公司使用的測試平臺不同,所以將輸入的數(shù)據(jù)告訴代碼的方式也會有所區(qū)別刷喜。一種是“保姆”類型残制,即作為應(yīng)試者,并不需要考慮如何將輸入轉(zhuǎn)換成機(jī)器能看得懂的代碼掖疮,而只要實現(xiàn)解決問題的特定函數(shù)就可以了初茶。輸入的話已經(jīng)有固定的代碼實現(xiàn)了。典型例子比如抛巧粒客恼布、Leetcode以及HackerRank。另外一種是應(yīng)試者需要考慮如何將輸入轉(zhuǎn)變?yōu)榇a的全過程搁宾,這就有些像本科時做的那種Online Judge折汞,給個題目,然后編程板里全是空白的猛铅,需要從零開始寫起字支。
比如說有這樣的輸入樣例,其中第一行代表總共有多少數(shù)字,而第二行的輸入代表每個數(shù)字的內(nèi)容堕伪。
5
1 2 3 4 5
這種的話用C++之類的語言就非常好實現(xiàn)揖庄。只需要定義好對應(yīng)變量的類型,跟著輸入樣例的順序進(jìn)行數(shù)據(jù)輸入的實現(xiàn)就可以了欠雌。
int n;
cin >> n;
vector<int> array;
for(i = 0; i < n; i++){
int element;
cin >> element;
array.push_back(element);
}
但是如果使用的是Python環(huán)境的話就會出一些問題蹄梢,比如我們把上面的代碼修改為python的形式:
n = int(input());
array = []
for i in range n:
int element;
element = int(input());
array.append(element);
這個時候如果我們按照樣例輸入的方式輸入數(shù)據(jù),Python會在element的部分報錯富俄,原因是無法將輸入轉(zhuǎn)換成int格式的內(nèi)容禁炒。
為什么會出現(xiàn)這樣的原因呢?其實是因為當(dāng)我們輸入一行數(shù)據(jù)的時候霍比,python會直接將這一整行的數(shù)據(jù)賦值給element幕袱,所以當(dāng)?shù)谝淮屋斎雃lement的時候,最后得到的element是"1 2 3 4 5"的字符串格式(沒進(jìn)行強(qiáng)制int轉(zhuǎn)換的情況下)悠瞬,因為中間有空格所以無法轉(zhuǎn)換成數(shù)字(就算省去空格也不是我們想要的數(shù)字)们豌。
像C++這樣的語言上述代碼可以跑的一個很重要的原因是它們在定義每個變量的時候,會特定指出這個變量是哪個類型的浅妆,因此輸入的時候空格就相當(dāng)于一個截斷操作望迎,來進(jìn)行數(shù)字和數(shù)字的區(qū)分。(因為int類型不可能會包含空格)
那么在Python中凌外,應(yīng)該如何設(shè)置才可以在只用一行輸入的情況下辩尊,完成一個數(shù)組的賦值呢?
首先我們需要放棄使用For循環(huán)康辑,因為Python是將整行輸入賦值給對應(yīng)變量的摄欲,那么如果用for循環(huán),即使輸入沒有報錯晾捏,我們也沒有n行的輸入來完成這個循環(huán).(因為我們只有一行)
其次我們需要使用split函數(shù)來切分輸入的這一行數(shù)據(jù)蒿涎,使其變成["1","2","3","4","5"]的形式。
element = input().split()
這個時候需要注意的是惦辛,雖然我們已經(jīng)得到了一個數(shù)組劳秋,但是里面的每個元素都是str字符串格式,而不是我們想要的int格式胖齐,那么這個時候需要如何操作呢玻淑?
此時可以使用到python的map函數(shù),它的主要作用是對迭代對象進(jìn)行對應(yīng)的映射呀伙,并返回一個迭代器补履,它的用法如下,
map(function, iterable, ...)
第一個參數(shù)是function剿另,即需要進(jìn)行映射的函數(shù)箫锤。第二個參數(shù)是需要進(jìn)行映射的可迭代對象(iterable)贬蛙,例如list就是一種可迭代對象。
舉個栗子谚攒,假設(shè)我們定義一個函數(shù)阳准,使其返回值是輸入值的2倍,那么我們可以這么寫馏臭,
def a(num):
return num * 2
那么這個函數(shù)a就可以作為第一個參數(shù)function的輸入野蝇,與此同時我們定義一個輸入的列表array,
array = [1, 2, 3, 4, 5]
這樣我們可以通過map生成一個對應(yīng)的迭代器。當(dāng)然迭代器自己是無法做輸出的(如果直接print也是只會顯示迭代器自己的信息)括儒,這個時候可以使用list()函數(shù)將迭代器轉(zhuǎn)化為列表绕沈。
array = [1, 2, 3, 4, 5]
print(list(map(a, array)))
這時我們可以看到輸出為[2, 4, 6, 8, 10],這樣就完成了一個映射的全過程帮寻。其實map函數(shù)是一個不用for循環(huán)來實現(xiàn)批量操作的很好的方法乍狐。
回到之前的問題,我們應(yīng)該如何將字符串?dāng)?shù)組變成一個純數(shù)字類型的數(shù)組呢固逗?這個時候我們可以通過map映射對字符串?dāng)?shù)組中的每個元素做一個int強(qiáng)制轉(zhuǎn)換澜躺,即調(diào)用int()函數(shù)。然后通過list()將生成的迭代器轉(zhuǎn)換為數(shù)組抒蚜。
print(list(map(int, input().split())))
如果我們的輸入為1 2 3 4 5, 那么對應(yīng)的輸出就變?yōu)閇1, 2, 3, 4, 5]了耘戚。這樣我們就可以實現(xiàn)將一行的多個數(shù)據(jù)轉(zhuǎn)變?yōu)橐粋€數(shù)組的功能了嗡髓。
完整代碼如下:
element = list(map(int, input().split()))
# finish your input
print(element)