您可以使用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
,因爲ints
是map
對象,因此已經是迭代器,所以我們不必爲它創建迭代器。所以,現在它看起來像
sums = map(sum, zip(*[ints]*2))
所有map
正在做的是加入了對後,我們將它們配對起來,讓我們丟棄了。
zip(*[ints]*2)
訣竅瞭解,這是瞭解該列表乘法首先發生
zip(*[ints, ints])
的*
在迭代面前的是拆包經營者。把它看成列表傾銷它的參數到函數
zip(ints, ints)
那麼,什麼是真正在做zip
? zip
的正常用法是取兩個迭代並將元素配對,如下所示。
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
,因此爲了安全起見,我一直使用它。
你是不是把貓和蝙蝠混在一起? – wim