Используйте ключевое слово key
для функции sorted()
и sort()
:
yourdata.sort(key=lambda e: e['key']['subkey'], reverse=True)
Демонстрация:
>>> yourdata = [{'key': {'subkey': 1}}, {'key': {'subkey': 10}}, {'key': {'subkey': 5}}]
>>> yourdata.sort(key=lambda e: e['key']['subkey'], reverse=True)
>>> yourdata
[{'key': {'subkey': 10}}, {'key': {'subkey': 5}}, {'key': {'subkey': 1}}]
Это предполагает, что все словари верхнего уровня имеют ключ key
, который считается словарем с клавишей subkey
.
См. Python Sorting HOWTO для получения более подробной информации и трюков.
Вы можете прототипировать свой собственный splice()
в String.
if (!String.prototype.splice) {
/**
* {JSDoc}
*
* The splice() method changes the content of a string by removing a range of
* characters and/or adding new characters.
*
* @this {String}
* @param {number} start Index at which to start changing the string.
* @param {number} delCount An integer indicating the number of old chars to remove.
* @param {string} newSubStr The String that is spliced in.
* @return {string} A new string with the spliced substring.
*/
String.prototype.splice = function(start, delCount, newSubStr) {
return this.slice(0, start) + newSubStr + this.slice(start + Math.abs(delCount));
};
}
String.prototype.splice = function(idx, rem, str) {
return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem));
};
var result = "foo baz".splice(4, 0, "bar ");
document.body.innerHTML = result; // "foo bar baz"
EDIT: Изменено, чтобы убедиться, что rem
является абсолютным значением.
Попробуйте это. Вот метод, который я написал, который ведет себя как все другие программирующие языки.
String.prototype.insert = function (index, string) {
if (index > 0)
return this.substring(0, index) + string + this.substring(index, this.length);
else
return string + this;
};
Пример использования:
var something = "How you?";
something = something.insert(3, " are");
Симпсоны.
Ссылка: http://coderamblings.wordpress.com/2012/07/09/insert-a-string-at-a-specific-index/
Учитывая ваш текущий пример, вы можете достичь результата либо
var txt2 = txt1.split(' ').join(' bar ')
, либо
var txt2 = txt1.replace(' ', ' bar ');
, но при условии, что вы можете сделать такие предположения, вы можете также пропустить непосредственно к примеру Gullen.
В ситуации, когда вы действительно не можете делать какие-либо предположения, кроме символов, основанных на индексе, тогда я действительно хотел бы найти подстрочное решение.
Просто выполните следующую функцию:
function insert(str, index, value) {
return str.substr(0, index) + value + str.substr(index);
}
, а затем используйте ее так:
alert(insert("foo baz", 4, "bar "));
Выход: foo bar baz
Он ведет себя точно так же, как C # (Sharp) String.Insert (int startIndex, строковое значение).
ПРИМЕЧАНИЕ. Эта функция вставки вставляет строковое значение (третий параметр) до указанного целочисленного индекса (второго параметра) в string str (первый параметр), а затем возвращает новую строку без изменения str!
Вы можете использовать регулярные выражения с динамическим шаблоном.
var text = "something";
var output = " ";
var pattern = new RegExp("^\\s{"+text.length+"}");
var output.replace(pattern,text);
выходы:
"something "
Это заменяет text.length
пробельных символов в начале строки output
. RegExp
означает ^\
- начало строки \s
любого символа пробела, повторение {n}
раз, в данном случае text.length
. Используйте \\
к \
, чтобы избежать обратных косых черт при построении таких шаблонов из строк.
Если кто-то ищет способ вставки текста по нескольким индексам в строке, попробуйте это:
String.prototype.insertTextAtIndices = function(text) {
return this.replace(/./g, function(character, index) {
return text[index] ? text[index] + character : character;
});
};
Например, вы можете использовать это для вставки тэгов <span>
при определенных смещениях в строке:
var text = {
6: "<span>",
11: "</span>"
};
"Hello world!".insertTextAtIndices(text); // returns "Hello <span>world</span>!"
6: "<span>"
говорит: в индексе 6 вставить текст & quot; & lt; span & gt; ". Вы говорите, что хотите использовать значение целочисленной переменной в качестве индекса вставки? Если это так, попробуйте что-то вроде var a=6, text = {}; text[a] = "<span>";
– Jake Stoeffler
12 May 2015 в 20:37
другое решение, вырежьте строку в 2 и поместите между ними строку.
var str = jQuery('#selector').text();
var strlength = str.length;
strf = str.substr(0 , strlength - 5);
strb = str.substr(strlength - 5 , 5);
jQuery('#selector').html(strf + 'inserted' + strb);
function insertString(string, insertion, place) {
return string.replace(string[place] + string[place + 1], string[place] + insertion + string[place + 1])
}
Итак, для вас это будет insertString("foo baz", "bar", 3);
Очевидно, что это будет краска для использования, потому что вы должны каждый раз передавать свою строку в функцию, но на момент я не знаю, как сделать его чем-то более легким, как string.replace(insertion, place)
. Однако идея все еще стоит.
Это в основном делает то, что делает @ Bass33, за исключением того, что я также даю возможность использовать отрицательный индекс для подсчета с конца.
// use a negative index to insert relative to the end of the string.
String.prototype.insert = function (index, string) {
var ind = index < 0 ? this.length + index : index;
return this.substring(0, ind) + string + this.substring(ind, this.length);
};
Use case: Предположим, вы имеете полноразмерные изображения, используя соглашение об именах, но не можете обновлять данные, чтобы также предоставлять эскизы эскизов.
var url = '/images/myimage.jpg';
var thumb = url.insert(-4, '_thm');
// result: '/images/myimage_thm.jpg'
Я знаю, что это старый поток, однако, это действительно эффективный подход.
var tn = document.createTextNode("I am just to help")
t.insertData(10, "trying");
Что здорово в этом, так это то, что он приводит в порядок содержимое узла. Поэтому, если этот узел уже был на DOM, вам не нужно будет использовать селектор запросов или обновлять innerText. Изменения будут отображаться из-за его привязки.
Если вам нужна строка, просто войдите в свойство текстового содержимого узла.
tn.textContent
#=> "I am just trying to help"
Вставка с определенным индексом (а не, скажем, при первом символе пробела) должна использовать строковое срез / подстрока:
var txt2 = txt1.slice(0, 3) + "bar" + txt1.slice(3);
substring
будет хорошо здесь. Я предпочитаю slice
вообще, потому что он более гибкий (отрицательные индексы, например "foo baz".slice(1, -2)
). Это также немного короче, для мало того, что стоит.
– Tim Down
9 November 2015 в 17:36
`${txt1.slice(0,3)}bar${txt1.slice(3)}`
– Jay
17 November 2015 в 19:54
delete
, которая включена в выше; верхний ответ ...
– Mr. Polywhirl
24 November 2015 в 20:08
my_string = "hello world";
my_insert = " dear";
my_insert_location = 5;
my_string = my_string.split('');
my_string.splice( my_insert_location , 0, my_insert );
my_string = my_string.join('');
UPDATE 2016: Вот еще одна функция just-for-fun (но более серьезная!), основанная на подходе с одним слоем RegExp
(с поддержкой prepend на undefined
или отрицательный index
):
/**
* Insert `what` to string at position `index`.
*/
String.prototype.insert = function(what, index) {
return index > 0
? this.replace(new RegExp('.{' + index + '}'), '$&' + what)
: what + this;
};
console.log( 'foo baz'.insert('bar ', 4) ); // "foo bar baz"
console.log( 'foo baz'.insert('bar ') ); // "bar foo baz"
Предыдущий (назад к 2012 году) решение для веселого :
var index = 4,
what = 'bar ';
'foo baz'.replace(/./g, function(v, i) {
return i === index - 1 ? v + what : v;
}); // "foo bar baz"
rem
. – Alvaro 22 April 2015 в 15:25slice
решение лучше и проще. (Splice - разрушительный, срез - нет, и лучше избегать модификации «объектов, которые вы не знаете»). Это решение абсолютно не должно быть первым видимым ответом, хотя в то время это могло иметь смысл. – Eirik Birkeland 20 August 2016 в 07:56my_array[my_array.length] = item
вместоmy_array.push(item)
? – user 17 September 2016 в 16:08