【问题标题】:Creating a dictionary of booleans from a list of variables从变量列表创建布尔字典
【发布时间】:2021-03-05 06:31:46
【问题描述】:

我正在尝试使用表达式的变量创建布尔字典。因此,如果表达式 1 具有变量 {x,y,z},我可以创建一个字典,该字典在生成时会返回类似 {'x': True, 'y': True, 'z': True}, {'x': False, 'y': True, 'z': True} ... etc

但我真的很挣扎,因为这个函数需要处理不同变量的集合/(也许我应该将它们放入列表?),所以对于 {x},字典将是 {'x' : True}, {'x' : False}

到目前为止,我正在尝试类似

的代码
def dicx(self):
    for i in self.vars():
        dicxow = { i : True for i in self.vars() }
        dicxow1 = dicxow.copy()
        dicxow1 = {i : False for i in self.vars() }
        return dicxow, dicxow1

其中self.vars() 返回表达式中的所有变量。

我不知道从哪里开始,因为我不知道如何为每个不同的变量只更改字典的一部分,所以任何提示都将不胜感激。我的任务包括使用类,所以我使用类来执行此操作(我不确定这是否会有所不同)。

编辑:

好的,抱歉,所以我只想为 x 个变量创建一个包含 True 和 False 的所有可能组合的字典,但我正在努力这样做。 self.vars() 从表达式中返回一组变量,例如{x,y} 并且我想创建一个函数来为 x 和 y 生成 True 和 False 的每个组合。

【问题讨论】:

  • 你的任务没有意义?你什么时候想要它是假的,你什么时候想要它是真的?,你所做的只是制作一个具有相反值的类似字典......
  • self.vars() 是一本字典,对吧?您想使用键还是值?我没有完全理解你的问题。
  • 为什么是外循环? for i in self.vars():。这也是无用的dicxow1 = dicxow.copy(),因为您正在覆盖下一行的 ref
  • 对不起 - 我刚刚编辑以澄清我正在尝试做的事情。我一开始尝试使用外部循环,但在 dicxow 中没有“for i in self.vars()”,但它无法正常工作。

标签: python dictionary set


【解决方案1】:

我认为这与您想要的很接近。要获取 n 变量的 TrueFalse 的所有组合,它只生成从 0 到 2 的所有整数值n -1。我把所有东西都放在一个虚拟的class 中,让它更像你的任务。

from pprint import pprint

class Expression:

    def __init__(self, *variables):
        self.variables = variables

    def vars(self):
        return self.variables

    def dicx(self):
        def bools(bit_string):  # Helper function
            """ Convert string of binary chars to list of corresponding booleans. """
            return [ch == '1' for ch in bit_string]

        n = len(self.vars())
        vals = list(range(2**n))
        bits = [format(v, f'0{n}b') for v in vals]
        return [dict(zip(self.vars(), bools(combo))) for combo in bits]


instance = Expression('x', 'y', 'z')
pprint(instance.dicx(), sort_dicts=False)

输出:

[{'x': False, 'y': False, 'z': False},
 {'x': False, 'y': False, 'z': True},
 {'x': False, 'y': True, 'z': False},
 {'x': False, 'y': True, 'z': True},
 {'x': True, 'y': False, 'z': False},
 {'x': True, 'y': False, 'z': True},
 {'x': True, 'y': True, 'z': False},
 {'x': True, 'y': True, 'z': True}]

【讨论】:

  • 这正是我想要的!谢谢!只有一个问题,format() 在这里做什么?我以前没见过
  • format() 是一个内置函数,它以受控方式将值转换为字符串。在这里,它用于将整数值转换为一定长度的二进制数字字符串 (n)。即2'010'
猜你喜欢
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 2021-03-12
  • 2014-01-24
相关资源
最近更新 更多