我必须通过添加一个元素来扩展列表。 Pos指示我应该插入新元素的位置以及应插入的值(原始列表中元素的值) F.e。
([1, 2, 3], 0) => [1, 1, 2, 3]
([1, 2, 3], 1) => [1, 2, 2, 3]
([1, 2, 3], 2) => [1, 2, 3, 3]
如果pos太高,我不得不在末尾添加0个元素。
([1, 2, 3], 9) => [1, 2, 3, 0]
到目前为止我已经完成了:
def extend_list(numbers, pos):
if pos > len(numbers) - 1:
numbers.append(0)
return numbers
return numbers[:pos] + numbers[pos] + numbers[pos:]
但我收到错误:TypeError: can only concatenate list (not "int") to list
我做错了什么?
答案 0 :(得分:2)
您的代码存在的问题是,数字[pos]是您要添加到numbers[:pos]
和numbers[pos:]
的整数,它们是列表。一个简单的解决方案是将return numbers[:pos] + numbers[pos] + numbers[pos:]
替换为return numbers[:pos] + [numbers[pos]] + numbers[pos:]
然而,更短的解决方案是:
vals = [([1, 2, 3], 0), ([1, 2, 3], 1), ([1, 2, 3], 2)]
new_vals = [[*a[:b], a[b], *a[b:]] for a, b in vals]
输出:
[[1, 1, 2, 3], [1, 2, 2, 3], [1, 2, 3, 3]]
在Python2中:
import itertools
new_vals = [list(itertools.chain.from_iterable([[c, c] if c == a[b] else [c] for c in a])) for a, b in vals]
输出:
[[1, 1, 2, 3], [1, 2, 2, 3], [1, 2, 3, 3]]
答案 1 :(得分:1)
您也可以使用.insert()
方法添加到列表中,如下所示。我还使用了else语句而不是个人偏好的2个返回语句。
def extend_list(numbers, pos):
if pos > len(numbers) - 1:
numbers.append(0)
else:
numbers.insert(pos, numbers[pos])
return numbers
事实上,由于python中列表的性质是可变对象,运行此函数将编辑原始列表,这意味着此处的return语句是不必要的,并且代码在没有它的情况下运行正常。
def extend_list(numbers, pos):
if pos > len(numbers) - 1:
numbers.append(0)
else:
numbers.insert(pos, numbers[pos])
lst = [1,2,3]
extend_list(lst, 1)
## will print [1,2,2,3] ##
print(lst)