【问题标题】:how to see if there is a value in a list that is between two values from another list如何查看列表中的值是否介于另一个列表的两个值之间
【发布时间】:2021-02-23 16:47:50
【问题描述】:

我有两个列表

a = [1, 4, 12]
b = [2, 13]

我想知道list b 中的值是否介于list a 中的两个值之间 因此,在这种情况下,2 将介于 1 和 4 之间。13 不会介于任何数字之间。

我已经尝试过bisect 功能,但我无法让它工作。我可以将它与单个值和一个列表一起使用,但不能与两个列表一起使用。

【问题讨论】:

  • 以上情况,你希望输出为[True, False]
  • 任意两个数字之间,或在一个接一个出现的数字之间,还是直接接一个接一个?第一个列表是否已排序?您是否只寻求是/否,或实际数字和/或它们在列表中的位置? b 中的所有值应该位于a 中的相同数字之间,还是它们是独立的?
  • @SidKwakkel 是 True,False 会起作用
  • @tobias_k 两个列表是独立的 - 两个数字之间可能没有任何值。另外,假设这两个列表是排序的。
  • 另外,“介于”是否意味着数字必须严格小于“介于”的数字?那么边界呢? 1412 是否会“介于”任意数量的 a 之间?

标签: python list bisect


【解决方案1】:

也许有一些我不明白的微妙之处,但除非我弄错了,否则你只需要检查元素是否在aminmax 之间。这与a 中的元素是否已排序或b 中的值是否必须介于a 中的连续值之间无关。只要它们在minmax 之间,必须a 中有一个“段”,这些值就在其中。

>>> a = [1, 4, 12]
>>> b = [2, 13]
>>> n, m = min(a), max(a)
>>> [n < x < m for x in b]
[True, False]

也就是说,当然,只有当 (a) 你不需要 它们之间有哪些 个数字,并且 (b) 如果不是 b 中的所有值都必须相同间隔。

如果您认为我遗漏了什么,请发表评论。

【讨论】:

  • 等等,没错!我们怎么会错过。此外,您列出的(a) 点并不是真正的缺点。无论如何都应该使用[x for x in b if n &lt; x &lt; m]
  • 一个可能的警告:如果“介于”真的意味着n &lt; x &lt; m,那么如果列表a 是“密集”,那么来自b 的数字可能没有任何间隔是“介于”之间,例如3 不在[1,2,3,4,5] 中的任何数字之间。
  • 我假设 a 和 be 永远不会有相同的数字。如果 3 在列表 A 中,则 B 永远不会包含 3
【解决方案2】:

这实际上取决于您希望它返回什么。我编写了一个代码,它会返回它找到的第一个模式,但我确信通过一些更改返回所有组合并不难。

def get_between(a, b):
    a, b = sorted(a), sorted(b)
    
    for b_value in b:
        smaller = None
        greater = None
        for a_value in a:
            if b_value > a_value:
                smaller = a_value
            elif b_value < a_value:
                greater = a_value
            
            if smaller and greater:
                return f"{b_value} is between {smaller} and {greater}"
    
    return "There is no such combination"

a = [1, 4, 12]
b = [2, 13]
print(get_between(a, b))

这种情况下的输出将是2 is between 1 and 4,但您可以将返回值调整为您想要的任何值。

【讨论】:

    【解决方案3】:

    您可以保留两个运行索引来获取介于值之间的所有元素的列表:

    def get_between(arr1, arr2):
        # first sort the arrays
        arr1 = sorted(arr1)
        arr2 = sorted(arr2)
        # keep two indices into them
        i1 = 0
        i2 = 0
        # keep track of the values between two values
        ret = []
        while i1 < len(arr1) - 1 and i2 < len(arr2):
            # we're too small to be between a value
            # so we should increase the second index
            if arr2[i2] < arr1[i1]:
                i2 += 1
            # we're too large to be between a value
            # so we should increase the first index
            elif arr2[i2] > arr1[i1 + 1]:
                i1 += 1
            # we are between a value
            # so we should append to the return array
            # and move on to the next element
            else:
                ret.append(arr2[i2])
                i2 += 1
        return ret
    
    get_between([1, 4, 12], [2, 8, 13]) # [2, 8]
    

    【讨论】:

      【解决方案4】:

      如果你不太关心性能,这里有一个pythonic解决方案-

      def betwn(rangelist, valuelist):
          # Get list of all ranges between each consecutive number of rangelist
          rgs = [range(rangelist[n], rangelist[n + 1]) for n in range(len(rangelist) - 1)]
          # A function to check whether a given element exists between 2 consecutive numbers of rangelist
          verifyfunc = lambda e: any(e in r for r in rgs)
          # Return the qualifying elements from valuelist
          return [e for e in valuelist if verifyfunc(e)]
      

      输出

      >>> betwn([1, 4, 12], [2, 13])
      [2]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        • 2015-03-27
        • 2023-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多