Чтобы получить URL-адрес файла, который использует FileField, вы можете просто вызвать атрибут url у FieldFile (это экземпляр файла, а не поле), он использует класс Storage для определения URL-адреса для этого файла. Это очень просто, если вы используете внешнее хранилище, такое как Amazon S3, или если ваше хранилище меняется.
get_thumbnail_url будет выглядеть следующим образом.
def get_thumbnail_url(self, obj):
return obj.thumbnail.url
Вы также можете использовать его в шаблоне следующим образом:
{{ current_project.thumbnail.url }}
Переверните всю строку, а затем переверните буквы каждого отдельного слова.
После первого прохода строка будет
s1 = "Z Y X si eman yM"
, а после второго прохода -
s1 = "Z Y X is name My"
Невозможно выполнить разворот без какой-либо дополнительной структуры данных. Я думаю, что самой маленькой структурой был бы один символ в качестве буфера, пока вы меняете буквы. Его все еще можно считать «на месте», но он не полностью «лишенный дополнительных структур данных».
Ниже приведен код, реализующий то, что описывает Ящерица Билла:
string words = "this is a test";
// Reverse the entire string
for(int i = 0; i < strlen(words) / 2; ++i) {
char temp = words[i];
words[i] = words[strlen(words) - i];
words[strlen(words) - i] = temp;
}
// Reverse each word
for(int i = 0; i < strlen(words); ++i) {
int wordstart = -1;
int wordend = -1;
if(words[i] != ' ') {
wordstart = i;
for(int j = wordstart; j < strlen(words); ++j) {
if(words[j] == ' ') {
wordend = j - 1;
break;
}
}
if(wordend == -1)
wordend = strlen(words);
for(int j = wordstart ; j <= (wordend + wordstart) / 2 ; ++j) {
char temp = words[j];
words[j] = words[wordend - (j - wordstart)];
words[wordend - (j - wordstart)] = temp;
}
i = wordend;
}
}
На каком языке? Если PHP, вы можете взорвать пространство, а затем передать результат в array_reverse.
Если это не PHP, вам придется сделать что-то более сложное, например:
words = aString.split(" ");
for (i = 0; i < words.length; i++) {
words[i] = words[words.length-i];
}
public static String ReverseString(String str)
{
int word_length = 0;
String result = "";
for (int i=0; i<str.Length; i++)
{
if (str[i] == ' ')
{
result = " " + result;
word_length = 0;
} else
{
result = result.Insert(word_length, str[i].ToString());
word_length++;
}
}
return result;
}
Это код C #.
Not exactly in place, but anyway: Python:
>>> a = "These pretzels are making me thirsty"
>>> " ".join(a.split()[::-1])
'thirsty me making are pretzels These'
Фактически, первый ответ:
words = aString.split(" ");
for (i = 0; i < words.length; i++) {
words[i] = words[words.length-i];
}
не работает, потому что он отменяет во второй половине цикла работу, проделанную в первой половине. Итак, i Примечание: я не знаком с синтаксисом PHP, и я догадался, что синтаксис инкрементного и декрементного значений похож на Perl. words = aString.split(" "); // make up a list
i = 0; j = words.length - 1; // find the first and last elements
while (i < j) {
temp = words[i]; words[i] = words[j]; words[j] = temp; //i.e. swap the elements
i++;
j--;
}
перевернуть строку, а затем, на втором проходе, перевернуть каждое слово ...
в C #, полностью на месте без дополнительных массивов:
static char[] ReverseAllWords(char[] in_text)
{
int lindex = 0;
int rindex = in_text.Length - 1;
if (rindex > 1)
{
//reverse complete phrase
in_text = ReverseString(in_text, 0, rindex);
//reverse each word in resultant reversed phrase
for (rindex = 0; rindex <= in_text.Length; rindex++)
{
if (rindex == in_text.Length || in_text[rindex] == ' ')
{
in_text = ReverseString(in_text, lindex, rindex - 1);
lindex = rindex + 1;
}
}
}
return in_text;
}
static char[] ReverseString(char[] intext, int lindex, int rindex)
{
char tempc;
while (lindex < rindex)
{
tempc = intext[lindex];
intext[lindex++] = intext[rindex];
intext[rindex--] = tempc;
}
return intext;
}
В c это можно сделать так: O (N) и только с использованием O (1) структур данных (т.е. char).
#include<stdio.h>
#include<stdlib.h>
main(){
char* a = malloc(1000);
fscanf(stdin, "%[^\0\n]", a);
int x = 0, y;
while(a[x]!='\0')
{
if (a[x]==' ' || a[x]=='\n')
{
x++;
}
else
{
y=x;
while(a[y]!='\0' && a[y]!=' ' && a[y]!='\n')
{
y++;
}
int z=y;
while(x<y)
{
y--;
char c=a[x];a[x]=a[y];a[y]=c;
x++;
}
x=z;
}
}
fprintf(stdout,a);
return 0;
}
Как насчет ...
var words = "My name is X Y Z";
var wr = String.Join( " ", words.Split(' ').Reverse().ToArray() );
Думаю, это не в строке.