【问题标题】:Python: Calculate difference between all elements in a set of integersPython:计算一组整数中所有元素之间的差异
【发布时间】:2016-06-12 14:48:54
【问题描述】:

我想计算一组整数中所有元素之间的绝对差。我正在尝试做abs(x-y),其中xy 是集合中的两个元素。我想对所有组合都这样做,并将结果列表保存在一个新集合中。

【问题讨论】:

  • 由于 python 集是无序的,因此没有“最后一个元素”。你可以在做你的事情之前把它转换成一个列表。 list(yourset)
  • 一般来说,你可以像list(myset)那样将任何集合变成一个列表,然后使用你的列表算法。但也许如果你提供一个你真正想要实现的例子,可能会有更好的方法。
  • python 集是“独特元素的无序集合”。所以没有“python集合中的最后一个元素”的含义
  • @miraculixx 我想计算一组整数中所有元素之间的绝对差。
  • @LokeshMeher 也许你提供一些示例输入和预期输出...

标签: python set


【解决方案1】:

我想计算一组整数 (...) 中所有元素之间的绝对差,并将结果列表保存在一个新集合中。

你可以使用itertools.combinations:

s = { 1, 4, 7, 9 }
{ abs(i - j) for i,j in combinations(s, 2) }
=>
set([8, 2, 3, 5, 6])

combinations 返回 s 中所有组合的 r 长度元组,无需替换,即:

list(combinations(s, 2))
=>
[(9, 4), (9, 1), (9, 7), (4, 1), (4, 7), (1, 7)]

【讨论】:

  • 有更快的方法吗?更大的集合需要太多时间(> 10 秒)。
【解决方案2】:

由于集合不保持顺序,您可以使用 ordered-set 之类的东西并迭代直到最后一个。

【讨论】:

    【解决方案3】:

    为了完整起见,这里有一个基于 Numpy ndarray's 和 pdist() 的解决方案:

    In [69]: import numpy as np
    
    In [70]: from scipy.spatial.distance import pdist
    
    In [71]: s = {1, 4, 7, 9}
    
    In [72]: set(pdist(np.array(list(s))[:, None], 'cityblock'))
    Out[72]: {2.0, 3.0, 5.0, 6.0, 8.0}
    

    【讨论】:

      【解决方案4】:

      这里是基于numpy的另一种解决方案:

      data = np.array([33,22,21,1,44,54])
      
      minn = np.inf
      index = np.array(range(data.shape[0]))
      for i in range(data.shape[0]):
          to_sub = (index[:i], index[i+1:])
          temp = np.abs(data[i] - data[np.hstack(to_sub)])
          min_temp = np.min(temp)
          if min_temp < minn : minn = min_temp
      print('Min difference is',minn)
      

      输出:“最小差为 1”

      【讨论】:

        【解决方案5】:

        这是使用组合的另一种方式:

        from itertools import combinations
        
        def find_differences(lst):
          " Find all differences, min & max difference "
          d = [abs(i - j) for i, j in combinations(set(lst), 2)]
        
          return min(d), max(d), d
        

        测试:

        list_of_nums = [1, 9, 7, 13, 56, 5]
        min_, max_, diff_ = find_differences(list_of_nums)
        print(f'All differences: {diff_}\nMaximum difference: {max_}\nMinimum difference: {min_}')
        

        结果:

        All differences: [4, 6, 8, 12, 55, 2, 4, 8, 51, 2, 6, 49, 4, 47, 43]
        Maximum difference: 55
        Minimum difference: 2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多