通过向特殊位置添加元素来扩展列表

时间:2017-11-22 16:50:59

标签: python python-3.x

我必须通过添加一个元素来扩展列表。 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 我做错了什么?

2 个答案:

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