【问题标题】:Python take modified list outside for loopPython将修改后的列表放在for循环之外
【发布时间】:2018-12-17 10:51:41
【问题描述】:

我一直在努力制作元组列表并找到每个元组的平均值。

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)]

【问题讨论】:

  • [[numpy.average(x)]*len(x) for x in original_list] ?
  • 查找元组解包。您可以将所有这些 r/g/b 和 miniList 分配放在一行中。只是一个想法。

标签: python list for-loop tuples


【解决方案1】:

您可以使用列表推导。下面是一个示例,它避免通过 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)]

【讨论】:

  • 非常感谢,但是如何在一行中使用 for 循环。
  • 在我看来,不要一行行。多线清晰高效。
【解决方案2】:
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)]

【讨论】:

    【解决方案3】:

    问题是在你的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

    这也适用于包含多于或少于三个元素的元组。我们所做的是计算miniListsum(..),然后除以miniListlen(..) 以获得平均值。然后我们像在原始函数中一样使用round(.., 2) 函数。

    接下来我们用(.., )将它包装在一个单例元组中,然后我们将它与元组的长度相乘,得到一个元组,我们在其中重复单例元组@中的元素987654331@次。

    话虽如此,构造一个 new 列表然后更改现有列表通常更 Pythonic。因为有可能其他变量引用了这个列表,现在也更新了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2018-07-18
      • 2023-01-25
      • 2018-10-18
      • 2022-11-20
      • 2020-02-05
      • 1970-01-01
      相关资源
      最近更新 更多