Reverse itemgetter(itemsetter?):将项列表插入较大列表中的特定位置

时间:2014-10-23 06:36:52

标签: python

我需要更正列表中的某些值。我正在使用itemgetter将值提取到一个较小的列表中。之后我需要将我更正的项目插入更大的列表中。有没有办法反向使用itemgetter将值列表插入特定位置的更大列表?如果没有,是否有更简洁的方法来插入每次插入不需要一行的元素?

get_data = itemgetter(*indexes)

line_as_list = line.split(",")
data = list(get_data(line_as_list))

# Change the elements in the list "data"

我目前插入项目的方式是

line_as_list[index1] = data[0]
line_as_list[index2] = data[1]
...

创建了很多样板代码。有没有更好的办法?我希望像

这样的东西
itemsetter(line_as_list, data, indexes)

4 个答案:

答案 0 :(得分:3)

标准库中没有itemsetter,但写起来很容易:

def itemsetter(*items):
    if len(items) == 1:
        item = items[0]
        def g(obj, value):
            obj[item] = value
    else:
        def g(obj, *values):
            for item, value in zip(items, values):
                obj[item] = value
    return g

示例:

lst = range(10, 20)
indexes = [1,3,5,7]

data = [81, 83, 85, 87]
setter = itemsetter(*indexes)

setter(lst, *data)
print lst # [10, 81, 12, 83, 14, 85, 16, 87, 18, 19]

答案 1 :(得分:2)

是的,您可以分配到拼接:

>>> big=[1,2,3,4]
>>> small=[1.5, 1.7]
>>> big[2:2]
[]
>>> big[2:2]=small
>>> big
[1, 2, 1.5, 1.7, 3, 4]

并且如果它不是空的:

>>> big=[1,2,3,4]
>>> small=[1.5, 1.7]
>>> big[2:3]=small
>>> big
[1, 2, 1.5, 1.7, 4]

答案 2 :(得分:0)

for i, index in enumerate(indexes):
    line_as_list[index] = data[i]

这很简单。对不起要问。

答案 3 :(得分:-1)

使用拼接

original = [1,2,3,4,5,6,7,8,9]

insert_element = ['foo']

insertion_index = 5

new_list = original[:insertion_index] + insert_element + original[insertion_index:]

print new_list