Python: Как заменить значение во вложенном списке?

Пара решений для загрузки async:

//this function will work cross-browser for loading scripts asynchronously
function loadScript(src, callback)
{
  var s,
      r,
      t;
  r = false;
  s = document.createElement('script');
  s.type = 'text/javascript';
  s.src = src;
  s.onload = s.onreadystatechange = function() {
    //console.log( this.readyState ); //uncomment this line to see which ready states are called.
    if ( !r && (!this.readyState || this.readyState == 'complete') )
    {
      r = true;
      callback();
    }
  };
  t = document.getElementsByTagName('script')[0];
  t.parentNode.insertBefore(s, t);
}

Если у вас уже есть jQuery на странице, просто используйте:

$.getScript(url, successCallback) *

Кроме того, возможно, что ваши сценарии загружаются / выполняются до того, как документ будет загружен, что означает, что вам нужно будет ждать document.ready до того, как события будут привязаны к элементам.

Невозможно точно рассказать, какова ваша проблема, не видя кода.

Самое простое решение - сохранить все ваши скрипты в нижней части страницы, Не блокируйте загрузку содержимого HTML во время их выполнения. Это также позволяет избежать необходимости асинхронной загрузки каждого требуемого сценария.

Если у вас особенно причудливое взаимодействие, которое не всегда используется, для чего требуется большой скрипт какого-либо типа, было бы полезно избежать загрузки этот сценарий пока не понадобится (ленивая загрузка).

* скрипты, загруженные с помощью $.getScript, скорее всего, не будут кэшироваться


Для всех, кто может использовать современные функции, такие как объект Promise , функция loadScript стала значительно проще:

function loadScript(src) {
    return new Promise(function (resolve, reject) {
        var s;
        s = document.createElement('script');
        s.src = src;
        s.onload = resolve;
        s.onerror = reject;
        document.head.appendChild(s);
    });
}

Имейте в виду, что эта версия больше не принимает callback, поскольку возвращенное обещание будет обрабатывать обратный вызов. Теперь было бы loadScript(src, callback) loadScript(src).then(callback).

У этого есть дополнительный бонус, позволяющий обнаруживать и обрабатывать сбои, например, можно вызвать ...

loadScript(cdnSource)
    .catch(loadScript.bind(null, localSource))
    .then(successCallback, failureCallback);

]

... и будет обрабатывать изъяны CDN изящно.

0
задан Akshay Nevrekar 13 July 2018 в 06:58
поделиться

11 ответов

Вы распаковываете из списка for for цикл и создаете 3 переменные name, appt и salary. С помощью этих переменных невозможно легко изменить структуру data. Вам нужно извлечь список из data и получить доступ к нему путем индексирования:

from pprint import pprint

data = [['Ben', 'Manager', 3000],
           ['James', 'Cleaner', 1000],
           ['Ken', 'Supervisor', 2000]]

for d in data:
    if d[0] == 'James':
        d[2] = 1500
        print(d)  # prints only changed row

pprint(data)  # prints whole structure

Печать:

['James', 'Cleaner', 1500]
[['Ben', 'Manager', 3000],
 ['James', 'Cleaner', 1500],
 ['Ken', 'Supervisor', 2000]]
1
ответ дан Andrej Kesely 17 August 2018 в 13:38
поделиться

Если вы знаете индекс, вы можете сделать:

data = [['Ben', 'Manager', 3000],
           ['James', 'Cleaner', 1000],
           ['Ken', 'Supervisor', 2000]]


data[1][2] = 1500

print(data[1])

вывод:

['James', 'Cleaner', 1500]
0
ответ дан Akshay Nevrekar 17 August 2018 в 13:38
поделиться

Я бы предложил использовать словарь для хранения вашей информации, например:

data = [['Ben', 'Manager', 3000],
        ['James', 'Cleaner', 1000],
        ['Ken', 'Supervisor', 2000]]

data_dict = {k: {'position': p, 'salary': s} for k, p, s in data}

data_dict['James']['salary'] = 1500

print(data_dict)

Выход:

{'Ben': {'position': 'Manager', 'salary': 3000}, 'James': {'position': 'Cleaner', 'salary': 1500}, 'Ken': {'position': 'Supervisor', 'salary': 2000}}

Если вам нужно преобразовать его обратно в список, просто используйте это:

print([[k] + list(v.values()) for k, v in data_dict.items()])

Выход:

[['Ben', 'Manager', 3000], ['James', 'Cleaner', 1500], ['Ken', 'Supervisor', 2000]]
0
ответ дан Ashish Acharya 17 August 2018 в 13:38
поделиться

В настоящий момент вы пытаетесь выполнить итерацию по трем значениям, которые на самом деле не имеют смысла в качестве параметров для цикла for. То, что вам нужно сделать, - это получить доступ к одному вложенному массиву за раз, проверить, является ли имя этого массива Джеймсом, и если это так, вы меняете зарплату.

data = [['Ben', 'Manager', 3000],
        ['James', 'Cleaner', 1000],
        ['Ken', 'Supervisor', 2000]]

for (person) in data:
    if person[0] == 'James':
        # change index 1 (occupation) to 1500
        person[1] = 1500

print(data)

Выход:

[['Ben', 'Manager', 3000],
 ['James', 'Cleaner', 1000],
 ['Ken', 'Supervisor', 2000]]
0
ответ дан Ben Botvinick 17 August 2018 в 13:38
поделиться

Я думаю, что лучше использовать класс для замены 2D-списка.

class Employee:
    def __init__(self, name, job, salary):
        self.name = name
        self.job = job
        self.salary = salary

    def __str__(self):

        return '[{}, {}, {}]'.format(self.name, self.job, self.salary)

    def __repr__(self):

        return '[{}, {}, {}]'.format(self.name, self.job, self.salary)

data = [Employee('James', 'Cleaner', 1000),
        Employee('Ben', 'Manager', 3000)]

print(data)

for employee in data:
   if employee.name == 'James':
    employee.salary = 1500
    print(employee)
print(data)

Выход:

[[James, Cleaner, 1000], [Ben, Manager, 3000]]
[James, Cleaner, 1500]
[[James, Cleaner, 1500], [Ben, Manager, 3000]]
0
ответ дан Cyrbuzz 17 August 2018 в 13:38
поделиться

Чтобы заменить зарплату:

data[1][2] = 1500

Чтобы распечатать данные:

print(data[1])
0
ответ дан Farhan 17 August 2018 в 13:38
поделиться

Переменная salary - это просто копия значения из data. Вы должны изменить исходный список вместо копии. Функция enumerate может генерировать индекс (от 0), необходимый для изменения значения внутри списка.

data = [['Ben', 'Manager', 3000],
       ['James', 'Cleaner', 1000],
       ['Ken', 'Supervisor', 2000]]

for i, (name, appt, salary) in enumerate(data):
    if name == 'James':
        data[i][2] = 1500
        print(data[i])

Выход: ['James', 'Cleaner', 1500]

0
ответ дан Isaac 17 August 2018 в 13:38
поделиться

Вам нужно найти индекс, в котором он встречается. Используйте enumerate.

for idx, (name,appt,salary) in enumerate(data):
    if name == 'James':
        # salary is at index 2 in the inner list
        data[idx][2] = 1500
        print(f"{name},{appt},{salary}")
5
ответ дан kantal 17 August 2018 в 13:38
поделиться
  • 1
    этот кортеж распаковывается, твердый материал. – RoadRunner 13 July 2018 в 06:02

Если вы хотите использовать Simple for Loop Then

data = [['Ben', 'Manager', 3000], ['James', 'Cleaner', 1000], ['Ken', 'Supervisor', 2000]]
for x in data:
    if 'Ben' in x:
        x[-1] = 1500
print(data) 
#Output: [['Ben', 'Manager', 1500], ['James', 'Cleaner', 1000], ['Ken', 'Supervisor', 2000]]
0
ответ дан Om trivedi 17 August 2018 в 13:38
поделиться

Вам нужно получить доступ к второму подсписку списка, а затем к третьему элементу подсписчика, чтобы изменить его. Посмотрите на код ниже:

data[1][2] = 1500
print(data)
0
ответ дан Yash Ghorpade 17 August 2018 в 13:38
поделиться
0
ответ дан Om trivedi 6 September 2018 в 09:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: