2013-05-30 40 views
2

我有一個字典,我將其轉換爲bytearray,並且由於bytearrays是不可變的(無法修改),我嘗試使列表等於字節數組中的每個索引。如何將bytearray的內容複製到列表(Python)?

a = {1:'a', 2:'b', 3:'c'} 
b = bytearray(str(a), 'ASCII') 
c = [] 

for i in b: 
    c[i] = b[i]  # Error on this line 

print(str(c)) 

問題是它一直在打印IndexError: bytearray index out of range
字節數組如何以及爲什麼超出範圍?

+0

Joran比斯利的回答解釋了爲什麼你得到這個例外。但是,如果你解決了這個問題(例如,用'for index,枚舉值(b):c [index] = value'),你只會在'list'上得到一個'IndexError'。如果你有一個空列表,你不能只設置'c [0]',因爲沒有'c [0]'來設置。你需要使用'append'(或者提出一些其他解決方案,比如預先分配列表c = [None for _in b]),但如果你知道如何做到這一點,你就會知道這個問題是不必要的)。 – abarnert

回答

5

如果我理解正確你的問題,你可以簡單地使用c = list(b)

a = {1:'a', 2:'b', 3:'c'} 
b = bytearray(str(a), 'ASCII') 
c = list(b) 

print(c) 

輸出:

[123, 49, 58, 32, 39, 97, 39, 44, 
32, 50, 58, 32, 39, 98, 39, 44, 
32, 51, 58, 32, 39, 99, 39, 125] 

爲了理解爲什麼你得到這個錯誤,請參閱本answer

+0

這是OP正在嘗試做什麼的答案; Joran Beasley的答案是OP如何做到的。 +1兩者。 – abarnert

+0

非常感謝您的快速和有益的答覆。我不知道列表功能。將在幾分鐘內標記爲答案。 –

+0

@約瑟夫韋伯:很高興我能幫你:) –

1

要修復代碼:

a = {1:'a', 2:'b', 3:'c'} 
b = bytearray(str(a), 'ASCII') 
c = [] 

for i in b: 
    c.append(i) 

,或者更好的是,你可以用list構造直接使用字節數組,並放棄循環:

c=list(b) 

,或者跳過字節數組並使用列表理解:

c= [ord(ch) for ch in str(a)] 

在所有這些情況下,您將獲得ASCII序如果這是你的目標:

[123, 49, 58, 32, 39, 97, 39, 44, 32, 50, 58, 32, 39, 98, 39, 44, 32, 51, 58, 32, 39, 99, 39, 125] 
4

ib不是索引

b = [1,5,20] 
for i in b: 
    print i #prints 1,then 5 , then 20 
+0

哦,我現在看到了。謝謝你清理那個。 –