负边界sli

2024-04-24 09:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个长度为n的元组,我需要检查除了位置w中的元素之外,同一位置中的所有元素是否都相同

if all(tup1[i] == tup2[i] for i in xrange(n) if i != w):
    ...

为了避免循环(因为这段代码会被多次使用),我尝试使用切片。不幸的是,这不起作用:

if tup1[w-1:w-n:-1] == tup2[w-1:w-n:-1]:
    ...

我必须写这样的东西吗?你知道吗

if tup1[:w-1] == tup2[:w-1] and tup1[w+1:] == tup2[w+1:]

难道没有更优雅的方法吗?你知道吗

或者循环和切片都不好,有更好的方法来获得我想要的结果吗?(我不能使用过滤器,因为可能有与位置w中的值相同的元素)


Tags: and方法代码in元素过滤器forif
1条回答
网友
1楼 · 发布于 2024-04-24 09:28:22

我想你已经找到了最好的解决办法:

 tup1[:w-1] == tup2[:w-1] and tup1[w+1:] == tup2[w+1:]

如果元组非常长,并且您不想复制数据,并且希望提前退出行为,那么使用itertools操作符有一个更复杂的选择:

>>> from operator import eq
>>> from itertools import imap
>>> w = 5
>>> t1 = (10, 20, 30, 40, -1, 50, 60, 70)
>>> t2 = (10, 20, 30, 40, -1, 50, 60, 70)
>>> it1, it2 = iter(t1), iter(t2)
>>> all(imap(eq, islice(it1, w-1), islice(it2, w-1))) \
    and (next(it1, True) or True) and (next(it2, True) and True) \
    and all(imap(eq, it1, it2))
True

这是一个大量的设置工作,逐步的速度不如元组切片,但它确实避免了复制所有的数据,而且它有一个早期的输出。你知道吗

在非极端情况下,我会坚持你的双切片元组等式解决方案。你知道吗

相关问题 更多 >