簡體   English   中英

Python將修改后的列表轉換為for循環

[英]Python take modified list outside for loop

我一直致力於制作元組列表並找到每個元組的平均值。

myList = [(1,2,3),(4,12,6)]
def GS(myList):
     for miniList in myList:
          r = miniList[0]
          g = miniList[1]
          b = miniList[2]
          GS = round((r+g+b)/3,2)
          miniList = list(miniList)
          miniList[0] = GS
          miniList[1] = GS
          miniList[2] = GS
          miniList = tuple(miniList)
     return myList     

 print(GS(myList))

我的清單是[(1,2,3),(4,12,6)]

我應該得到每個元組的平均值並替換三個元組

輸出: [(2.0,2.0,2.0),(7.33,7.33,7.33)]

您可以使用列表理解。 下面的示例避免了通過mapzip迭代器計算每個元組的長度兩次。

myList = [(1,2,3),(4,12,6)]

def GS(L):
    lens = map(len, L)
    res = [(sum(i)/i_len,)*i_len for i, i_len in zip(L, lens)]
    return res

print(GS(myList))

[(2.0, 2.0, 2.0), (7.333333333333333, 7.333333333333333, 7.333333333333333)]

如果您希望舍入小數,可以使用:

res = [(round(sum(i)/i_len, 2),)*i_len for i, i_len in zip(L, lens)]
myList = [(1,2,3),(4,12,6)]
[(round(sum(e)/len(e)),)*len(e) for e in myList]
# [(2.0, 2.0, 2.0), (7.33, 7.33, 7.33)]

問題是在你的for循環中,你寫道:

 for miniList in myList:
     # ...
     miniList = tuple(miniList)

你在這里似乎想通過引用分配 但這在Python中是不可能的(或者至少沒有這種語法)。

但是,您可以使用例如索引,並執行它:

def GS(myList):
     for idx, miniList in enumerate(myList):
          r = miniList[0]
          g = miniList[1]
          b = miniList[2]
          GS = round((r+g+b)/3,2)
          miniList = list(miniList)
          miniList[0] = GS
          miniList[1] = GS
          miniList[2] = GS
          myList[idx] = tuple(miniList)
     return myList

話雖如此,這是一個相當復雜的方法。 你可以使用例如:

def GS(myList):
     for idx, miniList in enumerate(myList):
          miniList[idx] = (round(sum(miniList)/len(miniList), 2),) * len(miniList)
     return myList

這也適用於包含多於或少於三個元素的元組。 我們要做的就是計算sum(..)中的miniList ,並除以該len(..)中的miniList獲得的平均值。 然后我們像原始函數一樣使用round(.., 2)函數。

接下來,我們將它包裝在單個元組中 ,使用(.., ) ,然后我們將它與元組的長度相乘,以獲得一個元組,我們在單元組元組len(miniList)重復元素。

話雖如此,構建列表然后更改現有列表通常更Pythonic 由於其他變量可能引用此列表,現在也會更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM