import pandas as pd
custom_dict = {'March':0,'April':1,'Dec':3}
df = pd.DataFrame(...) # with columns April, March, Dec (probably alphabetically)
df = pd.DataFrame(df, columns=sorted(custom_dict, key=custom_dict.get))
возвращает DataFrame со столбцами March, April, Dec
function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
var args = [i1, i2, i3, i4, i5, i6, i7, i8]; // put values in an array
this.i = [];
for (var i=0,j=0 ;i<8;i++) { // now i goes from 0-7 also
var k = args[i]; // get values out
if (k > 0) {
this.i[j++] = k;
}
}
}
Приведенный выше код может быть упрощен дальше, я только что сделал минимальное изменение для избавления от EVAL
. Вы можете избавиться от j
, например:
function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
var args = [i1, i2, i3, i4, i5, i6, i7, i8];
this.i = [];
for (var i = 0; i < args.length; i++) {
var k = args[i];
if (k > 0) { this.i.push(k); }
}
}
эквивалентно. Или, чтобы использовать встроенный аргументы
объект (чтобы избежать своего списка параметров в двух местах):
function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
this.i = [];
for (var i = 1; i < arguments.length; i++) {
var k = arguments[i];
if (k > 0) { this.i.push(k); }
}
}
Даже если вы не фильтруете список, вы не хотите что-то делать this.i = аргументы
, потому что аргументы
не является реальным массивом; Он имеет свойство callee
, которое вам не нужно, и отсутствует некоторые методы массива, которые вам могут понадобиться в I
. Поскольку другие указали, что если вы хотите быстро преобразовать аргументы
в массиве, вы можете сделать это с этим выражением:
Array.prototype.slice.call(arguments)
Вы можете использовать это вместо var args = [ I1, I2 ...
Линии выше.
Одна альтернатива передаче массива в вашу функцию вместо отдельных аргументов:
StrippedExample([3, 1, 4, 1, 5, 9, 2, 6])
Тогда ваш код будет:
function StrippedExample(inArray) {
this.i = [];
for (var i=0,j=0 ;i<inArray.length;i++) {
var k = inArray[i];
if (k > 0) {
this.i[j++] = k;
}
}
}
Если вам действительно нужно передать отдельные аргументы, вы можете доступ к ним с помощью вашего массива arguments
, который является объектом, который действует как массив (хотя на самом деле это не так; не все методы Array работают с ним), который предоставляет все аргументы, которые были переданы вашей функции; в этом случае их даже не нужно объявлять, но неплохо было бы включить комментарий, указывающий, какие аргументы вы ожидаете от пользователей вашего кода:
function StrippedExample(/*i1, i2, i3, i4, i5, i6, i7, i8*/) {
this.i = [];
for (var i=0,j=0 ;i<arguments.length;i++) {
var k = arguments[i];
if (k > 0) {
this.i[j++] = k;
}
}
}
Если вы гарантированно имеете только 8 элементов, тогда вы можно использовать 8
вместо inArray.length
или arguments.length
; Я решил использовать более общую версию в своих примерах на случай, если она будет вам полезна.
Этот код должен использоваться для использования массива arguments
, к которому имеет доступ каждая функция Javascript.
Дело не в том, что eval
злой (он в Лиспе, поэтому он должен быть хорошим ), это просто признак взлома - вам нужно что-то, чтобы работа, и вы заставили ее. Он кричит мне: «Автор отказался от хорошего программного дизайна и просто нашел то, что работало».
Вы просто создают массив из аргументов вашей функции 8, удаляя те, которые меньше или равны нулю.
Следующий код эквивалентен и будет работать с любым произвольным числом аргументов:
function StrippedExample() {
var args = [];
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] > 0) {
args.push(arguments[i]);
}
}
//...
}
Учитывая фиксированное количество переменных, вы можете создать их массив вручную и просмотреть его в цикле. Но если у вас есть переменное количество аргументов, один из способов передать переменные в функцию в виде массива:
var args = Array.prototype.slice.call(arguments.callee.caller.arguments);
И ваша функция будет выглядеть так:
function StrippedExample() {
var args = Array.prototype.slice.call(arguments.callee.caller.arguments);
for(var i in args) {
if (args[i] > 0) {
this.i[j++] = args[i];
}
}
}
function StrippedExample() {
this.i = [];
for (var i=1,j=0 ;i<arguments.length;i++) {
var k = arguments[i];
if (k > 0) {
this.i[j++] = k;
}
}
}