【问题标题】:Most efficient way of finding the next element in a tuple在元组中查找下一个元素的最有效方法
【发布时间】:2013-06-14 10:46:00
【问题描述】:

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

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)

所有元素都是唯一的,我不拘泥于元组,如果需要,我可以在程序的早期将它改成其他东西。

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

【问题讨论】:

  • 所有数字都是唯一的?
  • 如果您对数据结构(即元组)感到困惑,那么不会。线性搜索就是你所能做的。
  • 是的,所有元素都是唯一的,但实际上,在我的程序中不是数字,而是字符串。为了简化这个例子,我只是在这里做了数字..
  • 一个 dict 有 O(1) 的查找,但是对于小的元组,无论如何进行线性搜索可能会更快。这将取决于 Python 实现什么大小的元组仍然比字典快
  • 我有大约一百万个项目的元组,所以我认为 dict 将是我程序的巨大改进.. :)

标签: python tuples next


【解决方案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̀。

【讨论】:

    【解决方案2】:

    在此处使用字典,字典提供 O(1) 查找,而 list.indexO(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}
    

    【讨论】:

    • 您先生,才华横溢,是一个全能的人。谢谢!
    猜你喜欢
    • 2010-09-29
    • 2021-11-11
    • 1970-01-01
    • 2010-10-13
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    相关资源
    最近更新 更多