【问题标题】:using bisect with tuples in python在 python 中使用 bisect 和元组
【发布时间】:2021-06-06 02:46:39
【问题描述】:

我试图了解在 python 的 bisect 模块中使用 bisect 函数以及如何将它与元组一起使用。我已经看到它需要一个列表和一个值来找到放置值的索引。在我的情况下,该值是一个元组。这是来自 leetcode 981 https://leetcode.com/problems/time-based-key-value-store/。 A 是一个元组列表,元组将包含 (int,string) 作为其数据。

class TimeMap(object):
def __init__(self):
    self.M = collections.defaultdict(list)

def set(self, key, value, timestamp):
    self.M[key].append((timestamp, value))

def get(self, key, timestamp):
    A = self.M.get(key, None)
    if A is None: return ""
    i = bisect.bisect(A, (timestamp, chr(127)))
    return A[i-1][1] if i else ""

我了解他们为解决问题而尝试做的事情。我只是想了解为什么使用 chr(127)。我尝试使用 None 但它给出了一个错误。我猜它总是会采用元组中的第一个 int 值,因为 chr(127) 总是不合格的 bisect 接受。但我无法找到正确的原因。 IDLE 也将 chr(127) 显示为 \x7f 并发现它是非 ascii 字符。

【问题讨论】:

    标签: python-3.x binary-search bisect


    【解决方案1】:

    Python 逐个元素并从左到右比较元组。例如:

    (1, 2) > (1, 1)True

    (1, 2) > (1, 2)False

    我猜,他们使用chr(127),使元组中的第二项比任何其他字符都大。

    (1, chr(127)) > (1, 'z')True

    【讨论】:

    • 你是对的。 bisect 将从左到右比较元组,并且字符串值将始终大于元组 A 列表中的任何字符串。因此 bisect 将能够正确比较。在 leetcode 论坛中发现
    【解决方案2】:

    终于在 leetcode 论坛中找到了一些可以理解的解决方案。所有积分都归 leetcode 用户所有 https://leetcode.com/slvher/https://leetcode.com/jcodem/

    lower char 的 ascii 码范围是 [97, 122],因此可以使用 chr(127) 来确保 bisect.bisect(A, (timestamp, chr(127))) 找到的索引满足条件:timestamp_prev

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2022-06-10
      相关资源
      最近更新 更多