有没有一个好的pythonic方法来进行左值排列?

2024-05-16 17:54:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  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)

Tags: 数据insourcefor组件rangerandomvariable
3条回答

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

variable = dict(zip(selector, ordered_source_tuple))

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

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

创建新颜色,然后在分配给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)

这不再是一个单行程序,但是如果您在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))

当然,这或多或少相当于赋值循环,但它将其隐藏在一个有点通用性的函数中。你知道吗

相关问题 更多 >