【问题标题】:Comparing contents in the given tuples比较给定元组中的内容
【发布时间】:2022-11-20 22:56:21
【问题描述】:

我有两个 python 类“元组”,我想比较它们的内容并只获取仅在“停用”元组中的内容,例如。

deactivated = ((34, 'abcd'), (250, 'def'), (350, 'xyz'))
schedules = ((34, 'abcd'), (250, 'def'))
to_deactivate = ()

在这里,我想将不在计划中的(350, 'xyz') 推送到另一个变量to_deactivate

我已经在线查看了一些解决方案,但其中大多数只是比较元组是否相同。请帮我解决这个问题。

【问题讨论】:

  • 你试过什么了?您熟悉列表理解和成员资格检查吗?

标签: python tuples


【解决方案1】:

尝试:

deactivated = ((34, "abcd"), (250, "def"), (350, "xyz"))
schedules = ((34, "abcd"), (250, "def"))

to_deactivate = tuple(tpl for tpl in deactivated if tpl not in schedules)
print(to_deactivate)

印刷:

((350, 'xyz'),)

【讨论】:

  • 谢谢大佬,效果很好!! :)
【解决方案2】:

您可以使用迭代两次将一个元组中的每个元素与另一个元组中的每个元素进行比较,并获取仅在第一个元组中存在值的索引值

for i in deactivated:
    for j in schedules:
        if deactivated[i] not in schedules[j]:
            to_deactivate.append(deactivated[i])

这应该可以正常工作。

【讨论】:

  • 但是to_deactivate 是一个元组。你不能.append()一个元组。事实上,您不能以任何方式更改元组。
【解决方案3】:

您确定这些变量应该是元组吗?

因为元组是不可变的。从本质上讲,您不应该在其中添加或删除内容。看起来这些变量旨在成为您添加或删除内容的集合。这对于元组是不可能的。

例如,集合,因为您似乎不关心顺序,但似乎对其中包含或不包含的内容感兴趣。这就是 sets 的用途。非常快速地检查其中是否有东西(使用同样简单的 in 运算符。但是 in 对于列表或元组来说是 O(n),并且是 O(log(n)),实际上甚至是 O (1) 带套)。

所以,这只是一个评论,但我觉得那些变量应该已经设置好了。 在这种情况下,您的问题的答案就是

to_deactivate =  deactivated - schedules

即使您坚持将它们保留为元组,一个紧凑的答案仍然是使用集合

to_deactivate=tuple(set(deactivated)-set(schedules))

请注意,这比复合元组解决方案更快。 (1.38 μs vs 1.59 μs 在我的电脑上。当输入元组的大小增加时,时间差异也会增加)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2019-03-24
    • 2017-07-21
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多