2016-11-08 52 views
4

我是一個新的程序員學習Python和時遇到的如何處理這個任務麻煩:依次加入數字的字符串

所以基本上我有一個數字,以從文件中讀取輸入的字符串,需要將第一個數字的總和加到第二個數字上,並將其轉換爲正確的ASCII字符。因此,舉例來說,如果我讀的字符串:

'36 30 25 40 80 4' 

我希望到36加30,隨後的25到40,那麼80〜4等,把它們轉換成相應的ASCII字符和印刷前(所以在這種情況下'CAT')。

到目前爲止,我認識到我需要使用split命令來拆分字符串,然後使用for循環來獲取連續數字的數據。我可以得到第一個字母的正確值,但是在將[1]添加到[0]後,「告訴」程序無法自動移動以添加[2]到[3]。我還需要爲多行完成此操作。

再次,我是一個新的編碼器,所以任何幫助,非常感謝。謝謝!

+2

你是不是把貓和蝙蝠混在一起? – wim

回答

2

,除帕特里克的建議是少不透明的(儘管更詳細)另一種方法是:

>>> x = '36 30 25 40 80 4' 
>>> nums = [int(n) for n in x.split()] 
>>> ''.join(chr(sum(nums[i:i+2])) for i in range(0, len(nums), 2)) 
'BAT' 
+0

這實際上比Patrick更容易理解,因爲我還沒有學習過地圖和zip函數。謝謝! – chillbro

+0

@chillbro在jsbuenos的建議,我編輯了一個簡短的概述,在我的例子中發生了什麼,所以我希望能幫助你理解我在那裏做什麼。我希望它有幫助。 –

0

您可以使用列表comprehesnion爲做到這一點:

>>> my_string = '36 30 25 40 80 4' 
>>> num_list = [int(num) for num in my_string.split()] # list of numbers 
>>> ''.join(chr(sum(c_num)) for c_num in zip(num_list[:-1:2], num_list[1::2])) 
'BAT'  #         ^iterate simultaneous value with step 2 
+0

不是什麼問... – lucasnadalutti

+0

這不是什麼OP問 – coder

0

您可以循環使用範圍與第2步

for i in range(0, 6, 2): 
     do something to el[i] and el[i+1] 

這樣你就可以告訴程序去通緝指數使用。在這裏,我在循環將得到值:0,2,4]

3

您可以使用zip特殊的使用情況,以配對元素:

s = '36 30 25 40 80 4' 
ints = map(int, s.split()) #make into list of ints 
sums = map(sum, zip(*[iter(ints)]*2)) 
print(''.join([chr(i) for i in sums])) 

編輯:技術上iter是不必要在這裏,但我寫下來,因爲我有時會忘記我什麼時候需要它。

編輯2:下面尋址jsbuenos點:

map取一個函數和一個可迭代(如列表),並且該函數適用於迭代的每個元素。所以list(map(int, ['1', '2']))[int('1'), int('2')]相同。 list在那裏,因爲map實際上返回一個迭代器,它一次一個地產生一個值,而不是一次。

這裏使用的zip看起來很複雜,但這主要是所有的標點符號。讓我們嘗試並分解它。正如我所提到的,我們在這裏不需要iter,因爲intsmap對象,因此已經是迭代器,所以我們不必爲它創建迭代器。所以,現在它看起來像

sums = map(sum, zip(*[ints]*2)) 

所有map正在做的是加入了對後,我們將它們配對起來,讓我們丟棄了。

zip(*[ints]*2) 

訣竅瞭解,這是瞭解該列表乘法首先發生

zip(*[ints, ints]) 

*在迭代面前的是拆包經營者。把它看成列表傾銷它的參數到函數

zip(ints, ints) 

那麼,什麼是真正在做zipzip的正常用法是取兩個迭代並將元素配對,如下所示。

list(zip([1,2,3], [4,5,6])) #put the results from zip into a list 
[(1, 4), (2, 5), (3, 6)] 

它可以與兩個以上的列表了,但是這不是我們來這裏的目的。

重要的是要注意,在zip(ints, ints)這兩個參數是ints是同一個對象。這意味着當zip創建第一個對時,它首先從其第一個參數ints獲取下一個元素。那是36。然後它從第二個參數獲取下一個元素,它與ints相同。所以下一個元素是30。然後它產生元組中的這兩個元素,並繼續爲迭代器的其餘部分重複該過程。

如果你問自己「爲什麼寫zip(*[iter(ints)]*2)zip(ints, ints)意味着同樣的事情?」這是因爲你必須確保參數是相同的對象,否則它不起作用。做zip(iter(ints),iter(ints))不會工作,因爲每個iter返回一個不同的,雖然相同的迭代器。我無法記住何時必須使用iter,因此爲了安全起見,我一直使用它。

+3

「技術上」我嚴重懷疑你是否實際上幫助任何自稱「新編碼器」的語法,而不解釋你自己。 – jsbueno

+0

@jsbueno對不起,我不太關注。你是說我應該刪除免責聲明,我應該刪除'iter',或者我應該解釋'iter'在這裏做什麼? –

+2

我在說,你應該增加另一個例子,用一個簡單的,mlultiline'for'在上面,用簡單的英語寫下來,然後他們保留你當前的例子,並用簡單的英語解釋int - 否則這個答案對於自己而言,代碼打高爾夫球不錯,而不是OP,他們最終都不會理解「地圖」,「拉鍊」和理解。 – jsbueno

0

另一種解決方案:

string = '36 30 25 40 80 4' 
numbers = [int(e) for e in string.split()] 
res = ''.join([chr(numbers[i]+numbers[i+1]) for i in range(0,len(numbers),2)]) 
print(res) 

輸出: BAT

1

你可以這樣做,不用這麼簡單:

In [18]: str='36 30 25 40 80 4' 

In [19]: nums=str.split() 

In [20]: for i in range(0, len(nums), 2): 
    print(int(nums[i]) + int(nums[i+1])) 
    ....:  
66 
65 
84 

可能你想檢查,len(nums)是偶數。如果沒有IndexError將被拋出。

2

如果這是ascii編碼,我認爲你實際上有'BAT'而不是'CAT'。

>>> s = '36 30 25 40 80 4' 
>>> ints = [int(n) for n in s.split()]    # convert strings to integers 
>>> summed = [x+y for x,y in zip(ints[0::2], ints[1::2])]  # summing pairs 
>>> bytearray(summed).decode('ascii')     # decoding to ascii text 
'BAT' 
+2

'bytearray(summed).decode('ascii')'開箱即用的東西,+1 –

0

從帕特里克答案略有改變。

>>> t = "36 30 25 40 80 4" 
>>> t_s = map(int,t.split()) 
>>> t_s 
[36, 30, 25, 40, 80, 4] 
>>> "".join([chr(sum(c)) for c in zip(t_s[1::2],t_s[::2])]) 
'BAT' 
0

您可以使用擴展列表切片來獲得對相鄰的數字:

s = '36 30 25 40 80 4' 
a = [int(x) for x in s.split()] #convert to integers 
firsthalf = a[::2] #every other starting from 0 
secondhalf = a[1::2] #every other starting from 1 

然後你可以使用zip到兩半來概括:

pairs = zip(firsthalf, secondhalf) 

那麼你可以地圖sum巴黎的每一部分:

ordinals = [sum(x) for x in pairs] 

最終轉換爲字符串,請致電:

print(''.join([chr(x) for x in ordinals])) #prints: 'BAT' 
0

許多方式來做到這一點,但沒有造就了一批中間的列表,你可以簡單地創建一個迭代器,並使用一臺發電機來構造字符串:

>>> s = '36 30 25 40 80 4' 
>>> i = iter(map(int, s.split())) 
>>> ''.join(chr(sum(x)) for x in zip(i, i)) 
'BAT' 
0

您可以將字符串轉換爲迭代器返回的整數,並用一個列表解析裏next功能:

s = '36 30 25 40 80 4' 

# iter is not necessary in python3 
itr = iter(map(int, s.split())) 
word = ''.join(chr(a+next(itr)) for a in itr) 

print(word) 
# BAT 

海事組織這是一個有點清潔,因爲沒有明確的索引。