【问题标题】:How to merge an array with its array elements in Python?如何在 Python 中将数组与其数组元素合并?
【发布时间】:2019-01-18 00:41:50
【问题描述】:

我有一个如下所示的数组;

constants = ['(1,2)', '(1,5,1)', '1']

我想将数组转换为如下所示;

constants = [(1,2), 1, 2, 3, 4, 5, 1]

为此,我尝试了一些操作;

from ast import literal_eval
import numpy as np
constants = literal_eval(str(constants).replace("'",""))
constants = [(np.arange(*i) if len(i)==3 else i) if isinstance(i, tuple) else i for i in constants]

输出是;

constants = [(1, 2), array([1, 2, 3, 4]), 1]

所以,这不是预期的结果,我被困在这一步。问题是,如何将数组与其父数组合并?

【问题讨论】:

  • 为什么第一个元组没有被转换?
  • 我不需要转换它。我需要转换元组有 3 个值。
  • np.arange(1,5,1)返回np.array([1, 2, 3, 4])
  • @taras 是的。但这不是我的问题。问题是如何将它与父数组合并。

标签: python arrays merge


【解决方案1】:

请使用下面的代码来解析上述解析:

from ast import literal_eval


constants = ['(1,2)', '(1,5,1)', '1']
processed = []

for index, c in enumerate(constants):
    parsed = literal_eval(c)
    if isinstance(parsed, (tuple, list)) and index != 0:
        processed.extend(range(1, max(parsed) + 1))
    else:
        processed.append(parsed)

print processed  # [(1, 2), 1, 2, 3, 4, 5, 1]

【讨论】:

  • TypeError: isinstance 预期 2 个参数,得到 3 个
  • 结果不是我想要的。结果应该是; [(1,2), 1, 2, 3, 4, 5, 1]
  • @AndriyIvaneyko,如果元组不是列表的第一个元素怎么办?
  • @taras 项目将被追加。
【解决方案2】:

我将假设这个问题是非常字面的,并且你总是想改变这个:

constants = ['(a, b)', '(x, y, z)', 'i']

进入这个:

transformed = [(a,b), x, x+z, x+2*z, ..., y, i]

这样第二个元组的范围是从xy,步长为z。所以你最终转换的数组是第一个元素,然后是你的第二个元素定义的范围,然后是你的最后一个元素。最简单的方法就是一步一步来:

constants = ['(a, b)', '(x, y, z)', 'i']
literals = [eval(k) for k in constants]    # get rid of the strings
part1 = [literals[0]]                      # individually make each of the three parts of your list
part2 = [k for k in range(literals[1][0], literals[1][1] + 1, literals[1][2])]    # or if you don't need to include y then you could just do range(literals[1])
part3 = [literals[2]]
transformed = part1 + part2 + part3

【讨论】:

    【解决方案3】:

    我提出以下建议:

    res = []
    for cst in constants:
    
        if isinstance(cst,tuple) and (len(cst) == 3):
            #add the range to the list
            res.extend(range(cst[0],cst[1], cst[2]))
        else:
            res.append(cst)
    

    res 有你想要的结果。 可能有更优雅的方法来解决它。

    【讨论】:

      【解决方案4】:

      这是一种方法。

      演示:

      from ast import literal_eval
      
      constants = ['(1,2)', '(1,5,1)', '1']
      res = []
      for i in constants:                
          val = literal_eval(i)              #Convert to python object
          if isinstance(val, tuple):         #Check if element is tuple
              if len(val) == 3:              #Check if no of elements in tuple == 3
                  val = list(val)
                  val[1]+=1
                  res.extend(range(*val))
                  continue            
          res.append(val)
      print(res)
      

      输出:

      [(1, 2), 1, 2, 3, 4, 5, 1]
      

      【讨论】:

      • 如果数组:constants = ['(1,2)', '(1,5,1)', '1', '(0.1, 0.9, 0.1)'] 怎么办?错误是:“float”对象不能解释为整数。
      • ['(1,2)', '(1,5,1)', '1', '(0.1, 0.9, 0.1)'] 的预期输出是什么?
      • 预期结果:[(1,2), 1, 2, 3, 4, 5, 1, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
      • 我解决了;只需将range(*val) 更改为np.arange(*val)
      • 是的...我正要发布那个:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多