這段時間參加了幾個公司的在線筆試,發現了一個很有意思的現象,因為不同公司使用的測試平臺不同,所以將輸入的數據告訴代碼的方式也會有所區別。一種是“保姆”類型,即作為應試者,并不需要考慮如何將輸入轉換成機器能看得懂的代碼,而只要實現解決問題的特定函數就可以了。輸入的話已經有固定的代碼實現了。典型例子比如牛客、Leetcode以及HackerRank。另外一種是應試者需要考慮如何將輸入轉變為代碼的全過程,這就有些像本科時做的那種Online Judge,給個題目,然后編程板里全是空白的,需要從零開始寫起。
比如說有這樣的輸入樣例,其中第一行代表總共有多少數字,而第二行的輸入代表每個數字的內容。
5
1 2 3 4 5
這種的話用C++之類的語言就非常好實現。只需要定義好對應變量的類型,跟著輸入樣例的順序進行數據輸入的實現就可以了。
int n;
cin >> n;
vector<int> array;
for(i = 0; i < n; i++){
int element;
cin >> element;
array.push_back(element);
}
但是如果使用的是Python環境的話就會出一些問題,比如我們把上面的代碼修改為python的形式:
n = int(input());
array = []
for i in range n:
int element;
element = int(input());
array.append(element);
這個時候如果我們按照樣例輸入的方式輸入數據,Python會在element的部分報錯,原因是無法將輸入轉換成int格式的內容。
為什么會出現這樣的原因呢?其實是因為當我們輸入一行數據的時候,python會直接將這一整行的數據賦值給element,所以當第一次輸入element的時候,最后得到的element是"1 2 3 4 5"的字符串格式(沒進行強制int轉換的情況下),因為中間有空格所以無法轉換成數字(就算省去空格也不是我們想要的數字)。
像C++這樣的語言上述代碼可以跑的一個很重要的原因是它們在定義每個變量的時候,會特定指出這個變量是哪個類型的,因此輸入的時候空格就相當于一個截斷操作,來進行數字和數字的區分。(因為int類型不可能會包含空格)
那么在Python中,應該如何設置才可以在只用一行輸入的情況下,完成一個數組的賦值呢?
首先我們需要放棄使用For循環,因為Python是將整行輸入賦值給對應變量的,那么如果用for循環,即使輸入沒有報錯,我們也沒有n行的輸入來完成這個循環.(因為我們只有一行)
其次我們需要使用split函數來切分輸入的這一行數據,使其變成["1","2","3","4","5"]的形式。
element = input().split()
這個時候需要注意的是,雖然我們已經得到了一個數組,但是里面的每個元素都是str字符串格式,而不是我們想要的int格式,那么這個時候需要如何操作呢?
此時可以使用到python的map函數,它的主要作用是對迭代對象進行對應的映射,并返回一個迭代器,它的用法如下,
map(function, iterable, ...)
第一個參數是function,即需要進行映射的函數。第二個參數是需要進行映射的可迭代對象(iterable),例如list就是一種可迭代對象。
舉個栗子,假設我們定義一個函數,使其返回值是輸入值的2倍,那么我們可以這么寫,
def a(num):
return num * 2
那么這個函數a就可以作為第一個參數function的輸入,與此同時我們定義一個輸入的列表array,
array = [1, 2, 3, 4, 5]
這樣我們可以通過map生成一個對應的迭代器。當然迭代器自己是無法做輸出的(如果直接print也是只會顯示迭代器自己的信息),這個時候可以使用list()函數將迭代器轉化為列表。
array = [1, 2, 3, 4, 5]
print(list(map(a, array)))
這時我們可以看到輸出為[2, 4, 6, 8, 10],這樣就完成了一個映射的全過程。其實map函數是一個不用for循環來實現批量操作的很好的方法。
回到之前的問題,我們應該如何將字符串數組變成一個純數字類型的數組呢?這個時候我們可以通過map映射對字符串數組中的每個元素做一個int強制轉換,即調用int()函數。然后通過list()將生成的迭代器轉換為數組。
print(list(map(int, input().split())))
如果我們的輸入為1 2 3 4 5, 那么對應的輸出就變為[1, 2, 3, 4, 5]了。這樣我們就可以實現將一行的多個數據轉變為一個數組的功能了。
完整代碼如下:
element = list(map(int, input().split()))
# finish your input
print(element)