【问题标题】:Finding largest distance (on number scale) between n pairs of numbers找到 n 对数字之间的最大距离(在数字尺度上)
【发布时间】:2016-09-02 13:21:41
【问题描述】:

我正在尝试编写一个算法,在给定 n 对数字的情况下找到两个数字之间的最大距离。

这是我目前所拥有的。

Wire ints 是我的示例数字,第一对是 1,10,第二对是 1,10,第三对是 7,7

wire_ints = [10, 1, 1, 10, 7, 7]
longest_cases = {}
largest_length = 0
q = 0
y = 0
leftcounter = 0
rightcounter = 1

while q < len(wire_ints):
    left_port = wire_ints[leftcounter]
    right_port = wire_ints[rightcounter]
    length_wire = left_port - right_port
    wire_length = abs(length_wire)
    leftcounter = leftcounter + 2
    rightcounter = rightcounter + 2
    q = q + 2
    y = y + 1
    if not longest_cases:
        largest_length = wire_length
        longest_cases[wire_length] = y
    elif wire_length == largest_length:
        longest_cases[wire_length] = y
    elif wire_length > largest_length:
        largest_length = wire_length
        longest_cases.clear()
        longest_cases[wire_length] = y

print(longest_cases)

这当前输出{9:2},并没有错。 9 是这些数字对之间的最大距离。但是,我希望它打印{9:1, 9:2}

字典中的key指的是最大长度,value指的是原始数组中pair的个数。前 2 个整数是第 1 对,然后是第二对 2,依此类推。

所以,由于数组有两个长度相同的对,它应该在字典中输出两个对。

我想不通。 救命!

【问题讨论】:

  • 一旦您得到答案,请不要破坏您的问题。

标签: python


【解决方案1】:

这将获取您的初始输入并将其转换为元组列表。然后它计算元组成员之间的绝对差并将其放入一个新列表中。然后你的最终输出被创建为 index_list。

wire_ints = [10, 1, 1, 10, 7, 7]

new_list = [(x,y) for (x,y) in zip(wire_ints[::2], wire_ints[1::2])]
diff_list = [abs(x[0] - x[1]) for x in new_list]
index_list = [(x, index) for (index, x) in enumerate(diff_list) if x == max(diff_list)] 

print index_list

刚刚意识到这可以进一步压缩

new_list = [abs(x-y) for (x,y) in zip(wire_ints[::2], wire_ints[1::2])]
index_list = [(x, index) for (index, x) in enumerate(diff_list) if x == max(diff_list)] 

如果您非常想要字典,最好的方法可能是将最大值存储为键,并将列表或元组中的对数存储为值。

【讨论】:

  • 我有一个类似的答案,除了使用来自itertoolsgrouper 食谱但你要为我禁食:)
【解决方案2】:

只要字典中只有唯一键,您应该使用对号作为键或使用列表:

wire_ints = [10, 1, 1, 10, 7, 7]

longest_dict = []
longest_so_far = 0

for i in range(len(wire_ints)//2):
  j = i*2
  a, b = wire_ints[j:j+2]
  dist = abs(a - b)
  pair = [dist, i + 1]
  if dist > longest_so_far:
    longest_so_far = dist
    longest_dict = [pair]
  elif dist == longest_so_far:
    longest_dict.append(pair)

print(longest_dict)
#=> [[9, 1], [9, 2]]

【讨论】:

    【解决方案3】:

    您缺少的不是将距离索引保留在列表中。您可以通过以下代码提供:

    longest_cases = {}
    wire_ints = [10, 1, 1, 10, 7, 7]
    
    leftIndex = 0
    rightIndex = 1
    
    largest_length = 0
    y = 1
    
    while leftIndex < len(wire_ints):
        cur_length = abs(wire_ints[leftIndex] - wire_ints[rightIndex])
    
        if cur_length in longest_cases:
            currentList = longest_cases[cur_length]
        else:
            currentList = []
    
        currentList.append(y)
        longest_cases[cur_length] = currentList
    
        leftIndex = leftIndex + 2
        rightIndex = rightIndex + 2
        y = y + 1
    
    resultList = []
    resultCase = 0
    for k in longest_cases:
        if k > largest_length:
            resultList = longest_cases[k]
            resultCase = k
    
    for index in resultList:
        print resultCase, ":", index
    

    这里是the link,你可以看到结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-09
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多