python 比较给定元组中的内容

bf1o4zei  于 2022-11-21  发布在  Python
关注(0)|答案(3)|浏览(117)

我有两个python类'tuple'和,我想比较这两个类的内容,并仅获取仅在'deactivated' tuple中的内容,例如,

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

在这里,我想把不在调度表中的(350, 'xyz')推到另一个变量to_deactivate中。
我在网上查过一些解决方案,但大多数都只是比较元组是否相同。请帮助我解决这个问题。

ubbxdtey

ubbxdtey1#

请尝试:

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'),)
k5ifujac

k5ifujac2#

你确定那些变量应该是元组吗?
因为元组是不可变的。从本质上讲,你不应该在元组中添加或删除内容。看起来这些变量是用来添加或删除内容的集合。这对元组来说是不可能的。
例如,集合,因为你似乎不关心顺序,但似乎对什么是或不是它们感兴趣。这就是sets的作用。非常快速地检查是否有东西在其中(用同样简单的in操作符。但in对于列表或元组是O(n),而对于集合是O(log(n)),在实践中甚至是O(1))。
所以,这只是一个评论,但我觉得这些变量应该是集合。在这种情况下,你的问题的答案应该是

to_deactivate =  deactivated - schedules

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

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

请注意,这比复合元组解决方案要快。(1.38 μs对我的计算机上的1.59 μs。并且当输入元组的大小增加时,时间差也会增加)

vohkndzv

vohkndzv3#

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

deactivated = ((34, 'abcd'), (250, 'def'), (350, 'xyz'))
schedules = ((34, 'abcd'), (250, 'def'))
to_deactivate = ()
for i in range(len(deactivated)):
    if deactivated[i] not in schedules:
        to_deactivate += deactivated[i]
print(to_deactivate)

这样应该没问题。
编辑:仅迭代一次。

相关问题