代码之家  ›  专栏  ›  技术社区  ›  Camion

有没有一个很好的python方法来进行左值置换?

  •  2
  • Camion  · 技术社区  · 5 年前

    假设您希望对一组数据进行非对称转换,但是,您希望您的数据在这个转换方面是对称的。你会的

    1. 对数据进行随机排列,
    2. 对你的置换数据进行不对称转换,
    3. 颠倒排列顺序,将数据放回原位。

    问题:在原始数据空间上进行排列以将数据放回原位比构建反向排列容易得多。


    示例:要生成随机的前景色(远离背景色),需要远离三种基本色中的一种,而其他两种颜色可能都是随机的。 假设我的背景色是:

    import random
    background = tuple(random.randint(0, 0xff) for _ in range(3))
    

    让我们随机选择一个组件:

    selector = random.choice(((0, 1, 2), (1, 0, 2), (2, 0 ,1)))
    

    然后,我将选择我的第一个组件,远离那个组件:

    far_component = 0xff if background[selector[0]] < 0x80 else 0
    

    然后我将根据我的初始选择创建前景色:

    foreground = list(range(3))
    foreground[selector[0]] = far_component
    foreground[selector[1]] = random.randint(0, 0xff)
    foreground[selector[2]] = random.randint(0, 0xff)
    

    在这个简单的例子中,事情是可以管理的,但是让我们想象一个更复杂的例子,有更多的维度。它需要一个循环来管理所有的输出分配,如下所示:

    variable = len(selector)*None # If ever variable doesn't exist yet.
    for i in range(len(selector)):
        variable[selector[i]] = ordered_source_tuple[i]
    

    有没有一个很好的python方法来编写这样一个赋值,它看起来像一个变量的理解列表。类似这样的东西(显然行不通,因为左边的部分不是左值的元组):

    (variable[i] for i in selector) = ordered_source_tuple
    

    找到反向排列来写这不是一个简单的操作

    variable = ordered_source_tuple(reversed_selector)
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   chepner    5 年前

    创建新颜色,然后在指定给之前对其进行排列 foreground .

    import random
    from operator import itemgetter
    
    
    background = tuple(random.randint(0, 0xff) for _ in range(3))
    selector = random.choice(((0, 1, 2), (1, 0, 2), (2, 0 ,1)))
    far_component = 0xff if background[selector[0]] < 0x80 else 0
    
    permute = itemgetter(*selector)
    components = [far_component, random.randint(), 0xff), random.randint(0, 0xff)]
    foreground = permute(components)
    
        2
  •  0
  •   NicholasM    5 年前

    这不再是一个单行程序,但是如果您像中那样定义了一个辅助函数 this answer ,它变成了一个:

    def inverted_permutation(p):
        inverse = [0] * len(p)
        for i, p in enumerate(p):
            inverse[p] = i
        return inverse
    
    variable = tuple(source[i] for i in inverted_permutation(selector))
    

    当然,这或多或少相当于赋值循环,但它将其隐藏在某种通用函数中。

        3
  •  0
  •   Juan Carlos Ramirez    5 年前

    这可能是作弊,但字典呢:

    variable = dict(zip(selector, ordered_source_tuple))

    如果你想把它变成一个按键排序的对象,你可以这样做

    variable_list = [variable[i] for i in range(len(selector))]