【问题标题】:Inserting Elements of 1D array to specific location in 2D array将一维数组的元素插入到二维数组中的特定位置
【发布时间】:2020-10-19 00:24:07
【问题描述】:

尝试使用insert() 方法组合包含字符串的一维和二维列表/数组。

但是,从 1D 列表中获取特定元素并将其放置到 2D 列表中的特定位置是我卡住的地方。

这是目标的简化版本;

#2D list/array
list1= [['a1','b1'], ['a2','b2'] , ['a3','b3']]

#1D list/array
list2= ['c3','c2','c1']

#desired output
list1= [['a1','b1','c1'], ['a2','b2','c2'] , ['a3','b3','c3']]

这是我尝试使用的脚本中的隔离代码块;

#loop through 1D list with a nested for-loop for 2D list and use insert() method.
#using reversed() method on list2 as this 1D array is in reverse order starting from "c3 -> c1"
#insert(2,c) is specifying insert "c" at index[2] location of inner array of List1

for c in reversed(list2):
    for letters in list1:
        letters.insert(2,c)

print(list1)

以上代码的输出;

[['a1', 'b1', 'c3', 'c2', 'c1'], ['a2', 'b2', 'c3', 'c2', 'c1'], ['a3', 'b3', 'c3', 'c2', 'c1']] 

返回所需输出的最佳和最有效的方法是什么?我应该使用append() 方法而不是insert() 还是应该在使用任何方法之前引入列表连接?

任何见解将不胜感激!

【问题讨论】:

  • 一种简单有效的方法是在外部for循环中使用“枚举”(并删除内部for循环)。它允许接收与项目并行的索引。您可以使用“list1”上的此索引来访问和修改相应的子列表。更难理解的是使用“zip”而不是直接并行地从“list2”中获取子列表和项目。
  • 我看到我在这里使用内置的 enumerate 函数阅读,作为带有索引的元组作为枚举对象返回。我会先将此函数应用于一维数组 list2 吗?我也会阅读更多关于内置 zip() 函数的信息
  • 其实只对(反转的)“list2”。
  • 好的,我尝试了您的建议,即删除内部 for 循环并将外部 for 循环中的 enumerate 函数应用到反向 list2 中; for c in enumerate(reversed(list2)): print(list (c)) 我收到的输出是 [(0, 'c1'), (1, 'c2'), (2, 'c3')],这很好。现在我对如何使用这些索引来访问和修改 list1 中的子列表感到困惑。

标签: python arrays multidimensional-array concatenation nested-for-loop


【解决方案1】:

正如 cmets 中所讨论的,您可以通过使用 enumeratezip 的列表推导来实现此目的。您可以使用enumeratelist1 获取索引和子列表,使用indexlist2 中选择适当的值附加到每个子列表:

list1 = [l1 + [list2[-i-1]] for i, l1 in enumerate(list1)]

或者你可以zip一起list1和相反的list2

list1 = [l1 + [l2] for l1, l2 in zip(list1, list2[::-1])]

或者你可以使用一个简单的for循环来修改list1

for i in range(len(list1)):
    list1[i].append(list2[-i-1])

对于所有这些,输出是:

[['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'], ['a3', 'b3', 'c3']]

【讨论】:

  • 嘿@Nick,感谢您对如何解决这个问题的多种变化的回应。我将通过并应用每一个来了解引擎盖下发生的事情。但是,对于第一个和第三个解决方案,我确实对list2 的索引[-i-1] 有疑问。该索引是表示“负索引 1 处的负 i”还是“负 i 减 1”?
  • @HWFord16 它是负数(i+1),即负数 i 减 1。由于正索引从 0 开始,但负索引(从列表末尾向后读取)从 -1 开始,您需要将取反的正数减去 1 得到对应的负数。
  • 我认为这是有道理的。好的最后一个问题。函数range(len(list1)) 中的函数如何不抛出“TypeError”?我问的原因是,在我发布这个问题之前,我尝试将这些函数单独用于list1,错误是“int 对象不可迭代”或“列表不能被解释为整数”。当以这种方式使用这些内置函数时,如何绕过错误?我对此的理解是,“对于“i”在 0 和 list1 的长度之间的范围内”为循环迭代“i”提供了一个整数范围。这是正确的吗?
  • @HWFord16 完全正确; len(list1) 返回一个整数,list1 的长度然后range 返回一个从 0 到 len(list)-1 计数的序列,i 然后依次取该序列的每个值,0、1、 ..., len(list)-1
猜你喜欢
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 2021-06-27
  • 2016-11-03
  • 2013-07-30
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多