Работа с элементом по индексу в списке списков - PullRequest
0 голосов
/ 29 августа 2018

Предположим, у меня есть списки списков (называемые someListofLists), и я хочу умножить 4-й элемент каждого подсписка на 2. Я мог бы сделать следующее:

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

Есть ли более элегантный способ сделать это с помощью списочного понимания или других методов? Я бы хотел, чтобы вывод был списком списков.

Ответы [ 5 ]

0 голосов
/ 29 августа 2018

Вы можете использовать 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]]
0 голосов
/ 29 августа 2018

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

0 голосов
/ 29 августа 2018

Если вы счастливы использовать стороннюю библиотеку, вы можете сделать это на месте с помощью 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(), хотя часто это не нужно.

0 голосов
/ 29 августа 2018

Используйте понимание списка и enumerate, чтобы получить индекс и умножьте на 2, если индекс == 3

>>> 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]]
0 голосов
/ 29 августа 2018

Вы можете сделать это так:

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]]
...