查找元组中下一个元素的最有效方法

时间:2013-06-18 09:23:28

标签: python tuples next

我有一个系统,我经常(但不是经常)必须找到元组中的下一个项目。我现在这样做:

mytuple = (2,6,4,8,7,9,14,3)
currentelement = 4
def f(mytuple, currentelement):
    return mytuple[mytuple.index(currentelement) + 1]
nextelement = f(mytuple, currentelement)

所有元素都是独一无二的,我不会被元组困住,如果需要的话,我可以在程序的早期做出其他的东西。

由于我需要这么做很多,我想知道是否有更有效的方法来做到这一点?

2 个答案:

答案 0 :(得分:7)

在此处使用dict,dicts提供O(1)查找与list.index O(N)操作相比较。

这也适用于字符串。

>>> lis = (2,6,4,8,7,9,14,3)
>>> dic = dict(zip(lis, lis[1:]))
>>> dic[4]
8
>>> dic[7]
9
>>> dic.get(100, 'not found') #dict.get can handle key errors
'not found'

用于创建上述字典的内存高效版本:

>>> from itertools import izip
>>> lis = (2,6,4,8,7,9,14,3)
>>> it1 = iter(lis)
>>> it2 = iter(lis)
>>> next(it2)
2
>>> dict(izip(it1,it2))
{2: 6, 4: 8, 6: 4, 7: 9, 8: 7, 9: 14, 14: 3}

答案 1 :(得分:1)

您可能希望使用字典构建索引

# The list
>>> lis = (2,6,4,8,7,9,14,3)

# build the index
>>> index = dict(zip(lis, range(len(lis))))
>>> index
{2: 0, 3: 7, 4: 2, 6: 1, 7: 4, 8: 3, 9: 5, 14: 6}

# Retrieve position by using the index
>>> index[6]
1
>>> lis[index[6]+1]
4

如果您的列表随时间变化,则必须重建索引。对于更节省内存的解决方案,您可能更喜欢使用izip而不是其他答案中建议的`zip。