2013-01-01 56 views
0

可能重複:
How do you split a list into evenly sized chunks in Python?
What is the most 「pythonic」 way to iterate over a list in chunks?切片字符串轉換成列表

說我有一個字符串

s = '1234567890ABCDEF' 

我如何可以切片(或可能分裂是正確的術語?)這個字符串變成一個列表包含g每個包含2個字符的字符串?

desired_result = ['12', '34', '56', '78', '90', 'AB', 'CD', 'EF'] 

不知道這是否是相關的,但我解析的十六進制字符的字符串最終的結果我需要的是一個字節一個列表,從上面的列表中創建(例如,通過使用int(desired_result[i], 16)

回答

6
3>> bytes.fromhex('1234567890ABCDEF') 
b'\x124Vx\x90\xab\xcd\xef' 
+0

我總是在Py 3.x中忘記'fromhex' - 很好的+1 –

+0

TIL它有一個名字,叫做X-Y :) – miku

+0

'bytes.fromhex'很棒!但是有沒有辦法一次轉換4個(和8個)字符?像'words.fromhex'和'long.fromhex'? – Praetorian

3

你可以使用binascii

>>> from binascii import unhexlify 
>>> unhexlify(s) 
'\x124Vx\x90\xab\xcd\xef' 

然後:

>>> list(_) 
['\x12', '4', 'V', 'x', '\x90', '\xab', '\xcd', '\xef'] 
3
>>> s = '1234567890ABCDEF' 
>>> iter_s = iter(s) 
>>> [a + next(iter_s) for a in iter_s] 
['12', '34', '56', '78', '90', 'AB', 'CD', 'EF'] 
>>> 
+0

或者可能:'列表(''。加入(el)的郵編el(* [iter(s)] * 2))' –

0
>>> s = '1234567890ABCDEF' 
>>> [char0+char1 for (char0, char1) in zip(s[::2], s[1::2])] 
['12', '34', '56', '78', '90', 'AB', 'CD', 'EF'] 

但是,正如其他人所指出的,要轉化十六進制數字節的更一般的問題更直接的解決方案。 另請注意,羅伯特國王的解決方案一般來說效率更高,因爲它本質上具有零內存佔用(以不太易讀的代碼爲代價)。