Вы распаковываете из списка 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]]
Один из способов сделать это - создать карту идентификаторов компаний и идентификаторов фабрики, а затем просто выполнить итерацию по массиву компаний и добавить соответствующую фабрику к объекту компании, например, так:
Большое преимущество это то, что ваши фабричные поиски будут O(1)
, и это O(n)
, чтобы построить карту. Весь ваш алгоритм будет O(n)
. Это делает это чрезвычайно быстро даже для очень больших наборов данных.
let factories = [
{
id: 1,
name: "Xintang",
short: "xin",
companies: [0, 4, 101,198]
},
{
id: 2,
name: "Ohio Plant",
short: "OHP",
companies: [22, 27]
},
{
id: 3,
name: "Cincy",
short: "Cin",
companies: []
}
];
let companies = [
{
id: 0,
fund: "79588.96",
name: "Microsoft"
},
{
id: 1,
fund: "166727.06",
name: "Comcast"
},
{
id: 2,
fund: "131206.88",
name: "Apple"
},
{
id: 3,
fund: "74095.75",
name: "HP"
},
{
id: 4,
fund: "142556.86",
name: "Dell"
}
];
var factoryMap = factories.reduce((res, curr) => {
return Object.assign(res, curr.companies.reduce((_res, _curr) => (_res[_curr] = curr.name, res), {}))
}, {});
var mappedCompanies = companies.map(company => Object.assign(company, {factory: factoryMap[company.id] || ""}));
console.log(mappedCompanies);
Вы можете сделать следующее, используя reduce
и Map
.
Получите карту company-id
и factory-name
-> Затем выполните цикл по companies
и создайте вывод
let factories = [{id:1,name:"Xintang",short:"xin",companies:[0,4,101,198]},{id:2,name:"Ohio Plant",short:"OHP",companies:[22,27]},{id:3,name:"Cincy",short:"Cin",companies:[]}],
companies = [{id:0,fund:"79588.96",name:"Microsoft"},{id:1,fund:"166727.06",name:"Comcast"},{id:2,fund:"131206.88",name:"Apple"},{id:3,fund:"74095.75",name:"HP"},{id:4,fund:"142556.86",name:"Dell"}]
/*Get the company id: factory name mapping*/
const map = factories.reduce((m, f) =>
(f.companies.forEach(c => m.set(c, f.name)), m)
, new Map);
const output = companies.map(c => ({...c, factory: map.get(c.id) || ''}));
console.log(output)
Попробуй это ... Это может помочь тебе ...
let result = [];
companies.forEach(company => {
let tempCompany = {...company};
factories.forEach(factory => {
let tempArray = factory.companies.filter(item => item === company.id);
if(tempArray.length > 0) {
tempCompany.factory = factory.name;
}
});
result.push(tempCompany);
});