iT邦幫忙

1

Python 如何預留串列獨立位址

  • 分享至 

  • xImage

以下是我的 Code:

YogaTeacher = ("Kino", "Laruga", "DanySa")
BasketballPlayer = ["MJ", "LBJ", "Shaq"]
temp = [[[], [], []]] * 3

for i,j in enumerate (YogaTeacher):
    if (j == "DanySa"):
        for k, l in enumerate (BasketballPlayer):
            temp[i][k] = l
            
print (temp)

使用 Python IDE Spyder 印出的 Console 如下所示:

[['MJ', 'LBJ', 'Shaq'], ['MJ', 'LBJ', 'Shaq'], ['MJ', 'LBJ', 'Shaq']]

但我想要的是:

[[[], [], []], [[], [], []], ['MJ', 'LBJ', 'Shaq']]

請問如何做到?([ [ [ ], [ ], [ ] ], [ [ ], [ ], [ ] ], [ [ ], [ ], [ ] ] ] 不切實際,如果要宣告大型串列根本打字打到死,我想要的是類似 C 語言 array[n][m] 的做法,再拜託各位大神了!)

froce iT邦大師 1 級 ‧ 2024-12-18 15:04:57 檢舉
你temp = [[[], [], []]] * 3這個會弄成3份淺拷貝,裡面的元素記憶體位置都會一樣,所以改裡面的任一組元素都會3組一起變動,建議用id(temp[0])這樣去觀察記憶體位置。

temp 那句改成 temp = [list(list() for i in range(3)) for i in range(3)]

但我的建議是:
1. 佔位符不要用[],你實際上只有用2維陣列,陣列內元素明明是字串,幹嘛用list去佔位?
2. 重新審視一下分配位置的演算法。
像你搜尋DanySa,你可以用YogaTeacher.index("YogaTeacher")去拿index
然後直接 temp[YogaTeacher.index("YogaTeacher")] = BasketballPlayer
問題出在這段程式碼:
temp = [[[], [], []]] * 3
這樣寫的話,temp 的 3 個子列表實際上是指向相同的記憶體位置(也就是說,它們是共用的),所以當你修改其中一個子列表時,其他子列表也會被同步修改。

可以使用以下幾種方式解決這個問題

1. 使用 List Comprehension
temp = [[[], [], []] for _ in range(3)]
這樣每個子列表會擁有獨立的記憶體位置,因此修改其中一個不會影響其他子列表。
2. 使用 copy.deepcopy
import copy
temp = [copy.deepcopy([[], [], []]) for _ in range(3)]
這樣可以確保子列表中的所有層級都不會共用記憶體位置。
or
3. 使用froce提到index()來優化 但注意 index() 方法如果找不到值,會引發 ValueError。最好先檢查目標是否存在

YogaTeacher = ("Kino", "Laruga", "DanySa")
BasketballPlayer = ["MJ", "LBJ", "Shaq"]

# 初始化 temp 陣列
temp = [["" for _ in range(3)] for _ in range(3)] # 或者直接使用 [[]] 如果需要空列表

# 找出 "DanySa" 的索引,並直接分配值
index = YogaTeacher.index("DanySa")
temp[index] = BasketballPlayer

print(temp)


執行結果:
[['', '', ''], ['', '', ''], ['MJ', 'LBJ', 'Shaq']]
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

3
淺水員
iT邦大師 6 級 ‧ 2024-12-18 15:05:17

python 的 list 是動態的
可以不用像 C 語言那樣一開始就宣告大小
利用 appned 可以把元素添加到最後

YogaTeacher = ("Kino", "Laruga", "DanySa")
BasketballPlayer = ["MJ", "LBJ", "Shaq"]
temp = []

for i,j in enumerate (YogaTeacher):
    students = []
    for k, l in enumerate (BasketballPlayer):
        if (j == "DanySa"):
            students.append(l)
        else:
            # 不知道為什麼你要空陣列
            students.append([])
    temp.append(students)

print (temp)
2
zivzhong
iT邦研究生 2 級 ‧ 2024-12-18 15:46:02
YogaTeacher = ("Kino", "Laruga", "DanySa")
BasketballPlayer = ["MJ", "LBJ", "Shaq"]

# 初始化 temp 為三個獨立的子列表,每個子列表包含三個空列表
temp = [[[] for _ in range(3)] for _ in range(3)]

print("初始化 temp:")
print(temp)
print()

for i, j in enumerate(YogaTeacher):
    if j == "DanySa":
        for k, l in enumerate(BasketballPlayer):
            temp[i][k] = l

print("更新後的 temp:")
print(temp)

感謝三位大神,大家都回答得非常好,弱弱的我真是長知識了,最後我是採取 force 的做法,程式碼如下:

YogaTeacher = ("Kino", "Laruga", "DanySa")
BasketballPlayer = ["MJ", "LBJ", "Shaq"]
temp = [list (list () for i in range (3) ) for j in range (3)]
for i in range (len (BasketballPlayer)):
temp [YogaTeacher.index ("DanySa")][i] = BasketballPlayer[i]
print (temp)

站在巨人的肩膀上看得比較遠,希望我能實現我的夢想!

我要發表回答

立即登入回答