【问题标题】:More efficient way of creating new tuple by looping over old tuple通过循环旧元组创建新元组的更有效方法
【发布时间】:2021-06-13 23:30:41
【问题描述】:

当光标悬停在 tkinter 画布圆角矩形按钮上时,我已经设法调整颜色:

def shade_rgb(rgb):
    """ Adjust shade of rgb by 25% (value 64 out of 256)
        :param rgb: tuple of red, green, blue integers 0 to 255
        :returns:   tuple of red, green, blue integers 0 to 255
    """
    converted = []
    for i in rgb:
        if i < 128:
            i = i + 64
        else:
            i = i - 64
        converted.append(i)
    return tuple(converted)

我已经看到列表理解和元组生成器的代码,我相信它们会大大缩短代码。但是我可以“理解”如何让它发挥作用?


回复评论

“你在哪里卡住了?”

我对生成器的尝试是这样的:

return tuple(i = i + 64 if i<128 else i = i - 64 for i in rgb)

我通常会在 Python 中使用:

i = i + 64

或:

i += 64

但显然在生成器中,你进入了另一个宇宙,物理规则变为:

i + 64

【问题讨论】:

标签: python tuples generator


【解决方案1】:

您可以将generator expression 传递给tuple 构造函数。

return tuple(i+64 if i<128 else i-64 for i in rgb)

元组理解没有直接的语法,probably because tuples usually contain heterogeneous data, while lists usually contain homogeneous data

【讨论】:

  • Bonsoir,万岁。感谢您在五年前第一次开始学习 Linux 时在 Ask Ubuntu 中帮助我。我接受您的答案,这与几分钟前发布的其他两个答案相同,因为您包含了参考资料(引用的来源)。谢谢。
  • @Win De rien! (Mais, on dit «vive les Habs»。)它实际上并不完全相同,尽管在这种情况下差异是微妙的。 Prune 写了一个直截了当的生成器表达式,Shubham 写了一个列表推导式,然后他将其转换为 tuple
【解决方案2】:
return (i + 64 if i < 128
               else i - 64
         for i in rgb)

你在哪里卡住了?

【讨论】:

  • 35 年前,我被 dBase III+、Clipper、COBOL、BASIC、RPG 和汇编语言困住了 :)。一开始我有一个像你贴的那样的班轮,但我遇到了错误,所以我放弃了,做了很长的路要走。谢谢。
  • 我想我找到了卡住的地方并更新了我的问题以回复您的问题。
【解决方案3】:

试试这个:

return tuple([i+64 if i < 128 else i - 64 for i in rgb])

【讨论】:

  • 我有类似的单行代码有错误,因为我使用的是i = i + 64i = i * 64。有趣的是,您可以使用i+64 而不是i+=64,就像使用内联代码一样。
  • 您不需要[ ] 括号。您将获得与 tuple(i+64 if i &lt; 128 else i - 64 for i in rgb) 相同的元组
  • @AlexanderS.Brunmayr 虽然,列表理解可能更快
  • @juanpa.arrivillaga 谢谢你的评论,我不知道!我检查了当 rgb 是 3 元组时,从生成器生成元组比从列表理解生成元组慢 25-35%。因此,每个人都请包括 [ ] 括号,如 Shubham Periwal 的回答中所写。
猜你喜欢
  • 1970-01-01
  • 2015-11-09
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多