在列表列表中按索引操作

时间:2018-08-29 17:24:18

标签: python list list-comprehension

假设我有一个列表列表(称为someListofLists),并且我想将每个子列表的第4个元素乘以2。我可以执行以下操作:

new=[]
for k in someListofLists:
    this=k
    this[3]=this[3]*2
    new.append(this)

使用列表推导或其他方法是否有更优雅的方法?我希望输出仍然是列表列表。

5 个答案:

答案 0 :(得分:1)

您可以这样做:

def by_4(lst):
    r = lst[:]
    r[3] *= 2
    return r

someListofLists = [[1, 2, 3, 4], [5, 6, 7, 8]]
new = [by_4(k) for k in someListofLists]
print(new)

输出

[[1, 2, 3, 8], [5, 6, 7, 16]]

答案 1 :(得分:1)

如果您乐于使用第三方库,则可以使用NumPy就地执行此操作:

import numpy as np

A = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])

A[:, 3] *= 2

array([[ 1,  2,  3,  8],
       [ 5,  6,  7, 16]])

如果您需要列表,则可以使用A.tolist(),尽管通常这是不必要的。

答案 2 :(得分:1)

使用列表推导和enumerate获取索引,如果index == 3,则乘以2

>>> someListofLists = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
>>> [[e*2 if i==3 else e for i,e in enumerate(l)] for l in someListofLists]
[[1, 2, 3, 8, 5], [6, 7, 8, 18, 10]]

答案 3 :(得分:1)

new = [e*2 if i == 3 else e for k in someListofLists for i,e in enumerate(k)]

答案 4 :(得分:1)

您可以使用map和切片:

>>> someListofLists=[[1,2,3,4,5],[6,7,8,9,10]]
>>> map(lambda l: l[0:3]+[l[3]*2]+l[4:], someListofLists)
[[1, 2, 3, 8, 5], [6, 7, 8, 18, 10]]

您还可以结合使用mapenumerate和字典来按索引应用各种功能:

funcs={3: lambda x: x*2,
       4: lambda x: -x}

map(lambda sl: [funcs.get(i, lambda x: x)(e) for i,e in enumerate(sl)], someListofLists)

# [[1, 2, 3, 8, -5], [6, 7, 8, 18, -10]]