如何获得对称子列表,然后获得该子列表的总和?

时间:2021-03-18 08:22:38

标签: python list integer

代码的作用:将 Python 整数列表作为输入并搜索列表的“对称”内部部分,然后获取该内部部分并获取其总和。

如果从列表开始的第 i 个元素的值等于从列表末尾开始的第 i 个元素的值,则发生对称。

我想要的例子:

symmetrical_sum([10,11,12,11,12]) == ([11, 12, 11], 34)
symmetrical_sum([9,99,88,8,77,7,77,8,88,10,100]) == ([88, 8, 77, 7, 77, 8, 88], 353)
symmetrical_sum([10,8,7,5,9,8,15]) == ([8, 7, 5, 9, 8], 37) 

是否有任何短编码解决方案来获得上面给出的示例中的输出?我有一个正确的编码版本,但它有 30 多行代码,想知道是否有更短的方法。

2 个答案:

答案 0 :(得分:0)

尝试使用 numpy

  1. 获取表示条件的布尔值列表,如果 i 从头到尾的第一个元素相等
  2. 查找布尔值为 True 的索引
  3. 最小值表示对称开始的位置,最大值表示对称结束的位置,因此对列表数组进行切片以获得“对称”子列表
  4. 以元组形式返回新列表及其总和

以下代码应该适用于您发布的输入和输出:

import numpy as np

def sym_sum(arr):
    l = len(arr)-1
    bool_arr = np.array([x==arr[l-i] for i,x in enumerate(arr)])
    idx_arr = np.where(bool_arr==True)[0]
    if len(idx_arr):
        res = arr[min(idx_arr):max(idx_arr)+1]
    else:
        res = []
    return (res, sum(res))

如果您需要实际的对称输出,请使用:

import numpy as np

def get_sym(arr):
    l = len(arr) - 1
    bool_arr = np.array([x == arr[l - i] for i, x in enumerate(arr)])
    idx_arr = np.where(bool_arr == False)[0]
    if len(idx_arr):
        return get_sym(arr[min(idx_arr)+1:max(idx_arr)])
    else:
        return (arr, sum(arr))

这里我们递归地调用函数,直到不对称部分被完全条纹化。

答案 1 :(得分:0)

在纯 python 中,这可以这样实现:

def symmetrical_sum(a):


inner_portion = []
  sum = 0;
  start = 0;
  for i in a:
    end = len(a) - (start + 1);
    if a[start] == a[end]:
      inner_portion = a[start:(end+1)];
      for i in inner_portion:
        sum+= i
      break
    start+= 1
  return (inner_portion, sum)

print(symmetrical_sum([10,11,12,11,12])) #([11, 12, 11], 34)
相关问题