繁体   English   中英

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

[英]How to get a symmetrical sub list and then get the sum of that sub list?

代码的作用:将 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 多行代码,想知道是否有更短的方法。

尝试使用numpy

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

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

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))

如果您需要实际对称 output 使用:

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))

在这里,我们递归调用 function 直到不对称部分完全条纹。

在纯 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)
def symmetrical_sum(a): dup=[x for n, x in enumerate(a) if x in a[:n]] #to get the duplicate to_int = int(''.join(map(str,dup))) #change duplicate into int dup1_index=a.index(to_int) #index the first duplicate dup2_index=a.index(to_int,dup1_index+1) #index the second duplicate portion=a[dup1_index:dup2_index+1] #get the symetric portion total = sum(portion) #sum the elements in portion tuple1 = (portion,total) #create tuple return tuple1

您可以使用递归 function 执行此操作,如下所示:

def sym(L):
    if L[0] == L[-1]:
        lis, sum_list = L, sum(L)
        answer = f'inner-portion: {lis}, sum: {sum_list}'
        return answer
    else:
        return sym(L[1:-1])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM