使用 for / list comprehension 从任意数量的其他元组创建一个元组
Using for / list comprehension for creating a tuple from any amount of other tuples
使用以下代码,我正在研究如何创建 TRACKS[0]
和 ARM[0]
元组(甚至是整个集合,例如 ARM
),因为它们非常相似- 我认为像列表理解这样的东西会起作用(因为我正在为每个循环描绘一个)。
# MOTORS: all, m1, m2, m3, m4, m5 (+, -)
MOTORS = (
(
(0b01010101, 0b00000001, 0b00000000),
(0b10101010, 0b00000010, 0b00000000)
),
(
(2**0, 0, 0),
(2**1, 0, 0)
),
(
(2**2, 0, 0),
(2**3, 0, 0)
),
(
(2**4, 0, 0),
(2**5, 0, 0)
),
(
(2**6, 0, 0),
(2**7, 0, 0)
),
(
(0, 2**0, 0),
(0, 2**1, 0)
)
)
LED = (0,0,1)
# TRACKS: both, left, right (forward, reverse)
TRACKS = (
(
(MOTORS[4][0][0] | MOTORS[5][0][0], MOTORS[4][0][1] | MOTORS[5][0][1], MOTORS[4][0][2] | MOTORS[5][0][2]),
(MOTORS[4][1][0] | MOTORS[5][1][0], MOTORS[4][1][1] | MOTORS[5][1][1], MOTORS[4][1][2] | MOTORS[5][1][2])
),
MOTORS[4],
MOTORS[5]
)
# ARM: all, elbow, wrist, grip (forward/open, reverse/close)
ARM = (
(
(MOTORS[1][0][0] | MOTORS[2][0][0] | MOTORS[3][0][0], MOTORS[1][0][1] | MOTORS[2][0][1] | MOTORS[3][0][1], MOTORS[1][0][2] | MOTORS[2][0][2] | MOTORS[3][0][2]),
(MOTORS[1][1][0] | MOTORS[2][1][0] | MOTORS[3][1][0], MOTORS[1][1][1] | MOTORS[2][1][1] | MOTORS[3][1][1], MOTORS[1][1][2] | MOTORS[2][1][2] | MOTORS[3][1][2])
),
MOTORS[1],
MOTORS[2],
MOTORS[3]
)
def motormsk (motor_id, motor_config):
return (motor_config[motor_id][0][0] | motor_config[motor_id][1][0], motor_config[motor_id][0][1] | motor_config[motor_id][1][1], motor_config[motor_id][0][2] | motor_config[motor_id][1][2])
motormsk
函数执行逻辑 OR
来创建传入值的掩码,我认为它可以递归地用于生成掩码,该函数需要采取任何元组数。
此配置用于连接 USB 电机控制接口(如 OWI-535 Robotic Arm Edge),我正在添加虚拟系统配置(ARM
和 TRACKS
)让我可以轻松地改变它们/重新调整它们的用途。
用法:发送MOTORS[0][0]
启动所有电机正向,TRACKS[0][1]
启动反向轨道,TRACKS[1][0]
启动左侧轨道正向,motormsk(3, ARM)
停止夹具电机,等等
这里有一个 repl.it:https://repl.it/@zimchaa/robo-config - 谢谢。
编辑:根据改写的建议和对问题的澄清,我已经解决了 2 个元素的问题:
def motorcmb (motor_id_1, motor_dir_1, motor_id_2, motor_dir_2, motor_config):
return (motor_config[motor_id_1][motor_dir_1][0] | motor_config[motor_id_2][motor_dir_2][0], motor_config[motor_id_1][motor_dir_1][1] | motor_config[motor_id_2][motor_dir_2][1], motor_config[motor_id_1][motor_dir_1][2] | motor_config[motor_id_2][motor_dir_2][2])
这会产生:motorcmb(1, 0, 2, 1, TRACKS)
=> (64, 2, 0)
我仍然想看看对于任意数量的元素有什么可能/最佳实践。
我建议使用 itertools.chain()
将可变数量的元组减少为单个序列,然后
from operator import __or__
from functools import reduce
x = reduce(__or__, myiterable)
到 or
全部。我不太了解您的元组的嵌套方式,因此我不会尝试深入探讨细节。
使用以下代码,我正在研究如何创建 TRACKS[0]
和 ARM[0]
元组(甚至是整个集合,例如 ARM
),因为它们非常相似- 我认为像列表理解这样的东西会起作用(因为我正在为每个循环描绘一个)。
# MOTORS: all, m1, m2, m3, m4, m5 (+, -)
MOTORS = (
(
(0b01010101, 0b00000001, 0b00000000),
(0b10101010, 0b00000010, 0b00000000)
),
(
(2**0, 0, 0),
(2**1, 0, 0)
),
(
(2**2, 0, 0),
(2**3, 0, 0)
),
(
(2**4, 0, 0),
(2**5, 0, 0)
),
(
(2**6, 0, 0),
(2**7, 0, 0)
),
(
(0, 2**0, 0),
(0, 2**1, 0)
)
)
LED = (0,0,1)
# TRACKS: both, left, right (forward, reverse)
TRACKS = (
(
(MOTORS[4][0][0] | MOTORS[5][0][0], MOTORS[4][0][1] | MOTORS[5][0][1], MOTORS[4][0][2] | MOTORS[5][0][2]),
(MOTORS[4][1][0] | MOTORS[5][1][0], MOTORS[4][1][1] | MOTORS[5][1][1], MOTORS[4][1][2] | MOTORS[5][1][2])
),
MOTORS[4],
MOTORS[5]
)
# ARM: all, elbow, wrist, grip (forward/open, reverse/close)
ARM = (
(
(MOTORS[1][0][0] | MOTORS[2][0][0] | MOTORS[3][0][0], MOTORS[1][0][1] | MOTORS[2][0][1] | MOTORS[3][0][1], MOTORS[1][0][2] | MOTORS[2][0][2] | MOTORS[3][0][2]),
(MOTORS[1][1][0] | MOTORS[2][1][0] | MOTORS[3][1][0], MOTORS[1][1][1] | MOTORS[2][1][1] | MOTORS[3][1][1], MOTORS[1][1][2] | MOTORS[2][1][2] | MOTORS[3][1][2])
),
MOTORS[1],
MOTORS[2],
MOTORS[3]
)
def motormsk (motor_id, motor_config):
return (motor_config[motor_id][0][0] | motor_config[motor_id][1][0], motor_config[motor_id][0][1] | motor_config[motor_id][1][1], motor_config[motor_id][0][2] | motor_config[motor_id][1][2])
motormsk
函数执行逻辑 OR
来创建传入值的掩码,我认为它可以递归地用于生成掩码,该函数需要采取任何元组数。
此配置用于连接 USB 电机控制接口(如 OWI-535 Robotic Arm Edge),我正在添加虚拟系统配置(ARM
和 TRACKS
)让我可以轻松地改变它们/重新调整它们的用途。
用法:发送MOTORS[0][0]
启动所有电机正向,TRACKS[0][1]
启动反向轨道,TRACKS[1][0]
启动左侧轨道正向,motormsk(3, ARM)
停止夹具电机,等等
这里有一个 repl.it:https://repl.it/@zimchaa/robo-config - 谢谢。
编辑:根据改写的建议和对问题的澄清,我已经解决了 2 个元素的问题:
def motorcmb (motor_id_1, motor_dir_1, motor_id_2, motor_dir_2, motor_config):
return (motor_config[motor_id_1][motor_dir_1][0] | motor_config[motor_id_2][motor_dir_2][0], motor_config[motor_id_1][motor_dir_1][1] | motor_config[motor_id_2][motor_dir_2][1], motor_config[motor_id_1][motor_dir_1][2] | motor_config[motor_id_2][motor_dir_2][2])
这会产生:motorcmb(1, 0, 2, 1, TRACKS)
=> (64, 2, 0)
我仍然想看看对于任意数量的元素有什么可能/最佳实践。
我建议使用 itertools.chain()
将可变数量的元组减少为单个序列,然后
from operator import __or__
from functools import reduce
x = reduce(__or__, myiterable)
到 or
全部。我不太了解您的元组的嵌套方式,因此我不会尝试深入探讨细节。