【问题标题】:How to compare values with same index position between sublists within a list?如何比较列表中子列表之间具有相同索引位置的值?
【发布时间】:2021-02-26 18:36:41
【问题描述】:

为了简单起见,我将粘贴我认为相关的代码,如果需要其他内容,请发表评论。

假设我们有以下名为“states”的字典:

{0: ([[0, 0], [0, 0]], [1, 0]), 1: ([[0, 0], [0, 1]], [1, 0]), 2: ([[0, 0], [1, 0]], [1, 0]), 3: ([[0, 0], [1, 1]], [1, 0]), 4: ([[0, 1], [0, 0]], [1, 0]), 5: ([[0, 1], [0, 1]], [1, 0]), 6: ([[0, 1], [1, 0]], [1, 0]), 7: ([[0, 1], [1, 1]], [1, 0]), 8: ([[1, 0], [0, 0]], [1, 0]), 9: ([[1, 0], [0, 1]], [1, 0]), 10: ([[1, 0], [1, 0]], [1, 0]), 11: ([[1, 0], [1, 1]], [1, 0]), 12: ([[1, 1], [0, 0]], [1, 0]), 13: ([[1, 1], [0, 1]], [1, 0]), 14: ([[1, 1], [1, 0]], [1, 0]), 15: ([[1, 1], [1, 1]], [1, 0]), 16: ([[0, 0], [0, 0]], [0, 1]), 17: ([[0, 0], [0, 1]], [0, 1]), 18: ([[0, 0], [1, 0]], [0, 1]), 19: ([[0, 0], [1, 1]], [0, 1]), 20: ([[0, 1], [0, 0]], [0, 1]), 21: ([[0, 1], [0, 1]], [0, 1]), 22: ([[0, 1], [1, 0]], [0, 1]), 23: ([[0, 1], [1, 1]], [0, 1]), 24: ([[1, 0], [0, 0]], [0, 1]), 25: ([[1, 0], [0, 1]], [0, 1]), 26: ([[1, 0], [1, 0]], [0, 1]), 27: ([[1, 0], [1, 1]], [0, 1]), 28: ([[1, 1], [0, 0]], [0, 1]), 29: ([[1, 1], [0, 1]], [0, 1]), 30: ([[1, 1], [1, 0]], [0, 1]), 31: ([[1, 1], [1, 1]], [0, 1]), 32: ([[0, 0], [0, 1]], [-1, 0]), 33: ([[0, 0], [1, 0]], [-1, 0]), 34: ([[0, 0], [1, 1]], [-1, 0]), 35: ([[0, 1], [0, 0]], [-1, 0]), 36: ([[0, 1], [0, 1]], [-1, 0]), 37: ([[0, 1], [1, 0]], [-1, 0]), 38: ([[0, 1], [1, 1]], [-1, 0]), 39: ([[1, 0], [0, 0]], [-1, 0]), 40: ([[1, 0], [0, 1]], [-1, 0]), 41: ([[1, 0], [1, 0]], [-1, 0]), 42: ([[1, 0], [1, 1]], [-1, 0]), 43: ([[1, 1], [0, 0]], [-1, 0]), 44: ([[1, 1], [0, 1]], [-1, 0]), 45: ([[1, 1], [1, 0]], [-1, 0]), 46: ([[1, 1], [1, 1]], [-1, 0]), 47: ([[0, 0], [0, 1]], [0, -1]), 48: ([[0, 0], [1, 0]], [0, -1]), 49: ([[0, 0], [1, 1]], [0, -1]), 50: ([[0, 1], [0, 0]], [0, -1]), 51: ([[0, 1], [0, 1]], [0, -1]), 52: ([[0, 1], [1, 0]], [0, -1]), 53: ([[0, 1], [1, 1]], [0, -1]), 54: ([[1, 0], [0, 0]], [0, -1]), 55: ([[1, 0], [0, 1]], [0, -1]), 56: ([[1, 0], [1, 0]], [0, -1]), 57: ([[1, 0], [1, 1]], [0, -1]), 58: ([[1, 1], [0, 0]], [0, -1]), 59: ([[1, 1], [0, 1]], [0, -1]), 60: ([[1, 1], [1, 0]], [0, -1]), 61: ([[1, 1], [1, 1]], [0, -1])}

'states' 取决于三个变量: (注:以下变量的值生成上述字典)

NUM_MECS = 2
MAX_MEC_CAPACITY = 2
VNF_TYPES = 2

让我们从键 1 中选择值:

([[0, 0], [0, 1]], [1, 0])

'NUM_MECS' 确定元组的第一项(来自键 1 的值)将具有的子列表数。由于它的值为 2,我们有两个子列表:[[0, 0], [0, 1]]。

'MAX_MEC_CAPACITY' 确定元组中第一项的子列表中每个值的范围。也就是说,[[0, 0], [0, 1]] 中的任何值都可以在 0 到 1 的范围内。如果我们将值更改为 3,则意味着每个值的范围都在 0 到 2 之间(例如[[2, 0], [1, 2]])。

'VNF_TYPES' 将确定所有子列表以及元组中第二项的大小。由于它的值为 2,我们在所有子列表中只有大小为 2,并且从元组中的第二项开始列出([[size 2],[size 2]],[size 2])。

元组中的第二项,列表,只能保存两个值(1 或 -1),并且只有其中一项可以保存它,而其余的将保持为 0。无论大小列出其中只有一个项目将包含 1 或 -1。无论 1 或 -1 在哪里,都将确定元组中第一项的子列表元素的哪个位置将受到影响。因此,如果我们有:

 ([[0, 0], [0, 1]], [1, 0])

意味着一个单位可以从元组中的第一项开始在子列表中的任何一项中递增。

这里:

 ([[1, 0], [0, 1]], [1, 0])

或这里:

 ([[0, 0], [1, 1]], [1, 0])

如果我们有类似的:

([[0, 1], [1, 1]], [-1, 0])

意味着我们可以从子列表中的任何第一个元素中减去一个单元,在这种特殊情况下,我只会从第二个子列表中减去:

([[0, 1], [0, 1]], [-1, 0])

我们如何分配不相关的子列表添加或减去。

让我们只关注元组的第二项为 -1 的值。按照前面解释的指导方针,我们可以同意,我们不能减去任何东西的值是没有任何意义的,例如:

([[0, 0], [0, 0]], [-1, 0])

因此,我们可以实现以下内容,以消除后一个示例中所有可能的变化:

for key, state in states.values():
    if ([[0]*VNF_TYPES]*NUM_MECS == state[0]) and (-1 in s[1]):
        del states[key]

这只允许删除:

([[0, 0], [0, 0]], [-1, 0])

([[0, 0], [0, 0]], [0, -1])

问题说明

虽然上面的值已经从字典中删除了,但仍有一些值仍然没有意义,因此我想删除它们,比如:

([[0, 0], [0, 1]], [-1, 0]),
([[0, 0], [1, 0]], [0, -1]),
([[0, 1], [0, 0]], [-1, 0]),
([[1, 0], [0, 0]], [0, -1]),
([[0, 1], [0, 1]], [-1, 0]),
([[1, 0], [1, 0]], [0, -1]),
([[0, 1], [0, 1]], [-1, 0]),

我的问题是如何遍历所有值,然后遍历每个值的第一个列表中的所有子列表,以比较与元组第二项中的 -1 具有相同索引位置的值,以便删除它们?有什么建议吗?

显然,无论字典的结构如何,这个想法都是以通用方式进行,因此请不要建议任何硬编码方法。

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    此函数将确定元组是否有效。

    def is_valid_tuple(aTuple):
        try: 
            ind = aTuple[1].index(-1) 
        except ValueError: # There is no -1 
            return True 
        for ls in aTuple[0]: # for all sublists 
            if ls[ind] != 0: # if any are not zero, we are fine to exit 
                return True 
        return False 
    

    对于您的所有测试用例,它将返回 False

    【讨论】:

    • 正确!!!,感谢您的帮助。您可能需要更正 'tup[0]' 为 'aTuple[0]'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多