假设我有一个列表列表(称为someListofLists),并且我想将每个子列表的第4个元素乘以2。我可以执行以下操作:
new=[]
for k in someListofLists:
this=k
this[3]=this[3]*2
new.append(this)
使用列表推导或其他方法是否有更优雅的方法?我希望输出仍然是列表列表。
答案 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]]
您还可以结合使用map
,enumerate
和字典来按索引应用各种功能:
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]]