【问题标题】:Merging List after particular element在特定元素之后合并列表
【发布时间】:2014-10-23 21:23:06
【问题描述】:

我想将 2 个列表合并在一起(ListAListB)。但要注意的是,在ListA 中的某个元素之后。

用户在哪个元素之后输入ListB 应该与listA 合并。

例如;

ListA = [2,1,0]
ListB = [4,5,6]

用户输入 1

输出:

new_list = [2, 4, 5, 6, 1, 0]

现在我正在考虑使用for loop,但由于我对for loops 的了解有限,我不知道如何使循环在一定数量的循环后停止。

【问题讨论】:

  • “由于我对 For 循环的了解有限,我不知道如何使循环在一定数量的循环后停止”:并不是说这是解决问题的最佳方法,但如果你想这样做,答案是break。例如,for i, value in enumerate(ListA): 然后是if i == certain_index: break

标签: python list for-loop merge


【解决方案1】:

这实际上通过切片分配非常容易,正如Lists 的教程部分所述:

ListA = [2,1,0]
ListB = [4,5,6]

# make a copy -- I'm assuming you don't want to modify ListA in the process.
new_list = ListA[:]
# insert ListB at a particular location.  I've arbitrarily chosen `1`
# basically this says to take the empty section of the list
# starting just before index 1 and ending just before index 1 and replace it
# with the contents of ListB
new_list[1:1] = ListB
# Check the output to make sure it worked.
print(new_list)  # [2, 4, 5, 6, 1, 0]

【讨论】:

  • 你能解释一下这里发生了什么
  • @Ali:官方教程解释的很好;我添加了指向 mgilson 答案的链接。
  • @abarnert -- 感谢您的链接。
  • 所以只是为了更清楚一点......你是说它占用元素 1 和元素 2 之间的空白空间并用 ListB 填充它?
  • @Ali:这是一种非常合理的看待方式。但请记住您从 0 开始的编号。它在 before 元素 1(即第二个元素)右侧填充空白,而不是 after
【解决方案2】:
ListA = [2,1,0]
ListB = [4,5,6]
a=[]
def merg(i):
 for i in range(i):
  a.append(ListA[i])
 for j in ListB:
  a.append(j)
 a.append(ListA[i+1])
 return a

print merg(2)

演示:

[2, 1, 4, 5, 6, 0]

【讨论】:

  • 除了i==1 之外,我认为这对任何情况都没有他想要的效果。他想要a 的所有元素直到i,然后是b 的所有元素,然后是i 之后的a 的所有元素。这给了他ith 元素,然后将所有其他元素放在最后。
  • 你运行代码了吗?请先运行它!我在代码中做得很好,很明显!
  • 我刚刚做了……它完全按照我说的做了。例如,使用merg(2),您不会得到[2, 1, 4, 5, 6, 0],而是得到[0, 4, 5, 6, 2, 1]。事实上,它甚至没有为 OP 提供merg(1) 所需的输入。他要[2, 4, 5, 6, 1, 0],你给他[1, 4, 5, 6, 2, 0]
  • 我又读了一遍你的问题!我对代码的理解有误!我编辑代码!正确!
  • 如果这不是问题的有效答案,请删除答案。
【解决方案3】:

这是一种无需任何变异操作即可做到这一点的方法:

new_list = a[:i] + b + a[i:]

在实践中看到它:

>>> a = [2, 1, 0]
>>> b = [4, 5, 6]
>>> i = 1
>>> new_list = a[:i] + b + a[i:]
>>> new_list
[2, 4, 5, 6, 1, 0]

如果你不明白任何一段,你可以把它分解:

>>> a[:i]
[2]
>>> a[i:]
[1, 0]
>>> # etc.

那么,为什么要在不改变操作的情况下这样做呢?很多可能的原因:

  • 不改变值的代码更容易推理。它就像一个数学函数;您不必考虑事情发生的顺序或每一步的状态。如果你不理解它,你通常可以将它分解成更简单的部分,就像我在上面所做的那样。
  • 通常你实际上并不想要改变任何东西。在这种情况下,我们不必提前复制a,因为我们不打算修改它。
  • 它可以更具可读性,甚至对新手更友好。在这种情况下,您仍然需要了解切片,而不是切片分配。
  • 它通常更短。这是单线而不是两线。
  • 它通常更有效。这样可以避免复制整个列表,然后将大部分元素向右移动。

但它的可读性较差,或者更冗长,或者效率较低。因此,了解这两种做事方式是值得的,这样您就可以根据具体情况决定哪种方式合适。

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 2020-01-18
    • 2012-09-21
    • 1970-01-01
    • 2016-03-12
    • 2021-11-04
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多