Пара решений для загрузки 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 изящно.
Вы распаковываете из списка 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]]
Если вы знаете индекс, вы можете сделать:
data = [['Ben', 'Manager', 3000],
['James', 'Cleaner', 1000],
['Ken', 'Supervisor', 2000]]
data[1][2] = 1500
print(data[1])
вывод:
['James', 'Cleaner', 1500]
Я бы предложил использовать словарь для хранения вашей информации, например:
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]]
В настоящий момент вы пытаетесь выполнить итерацию по трем значениям, которые на самом деле не имеют смысла в качестве параметров для цикла 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]]
Я думаю, что лучше использовать класс для замены 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]]
Чтобы заменить зарплату:
data[1][2] = 1500
Чтобы распечатать данные:
print(data[1])
Переменная 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]
Вам нужно найти индекс, в котором он встречается. Используйте 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}")
Если вы хотите использовать 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]]
Вам нужно получить доступ к второму подсписку списка, а затем к третьему элементу подсписчика, чтобы изменить его. Посмотрите на код ниже:
data[1][2] = 1500
print(data)