我需要更正列表中的某些值。我正在使用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)
答案 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