Yes, the examples given are very different.
The first example effectively says:
Take the string
s
, split it by spaces, and then take each word,x
, found and return the minimum value of just the length ofx
.
The second example effectively says:
Find the minimum value in the list generated by
len(x) for x in s.split()
.
That first example generates an error because the min
function expects to compare at least 2 or more elements, and only 1 is provided.
That second example works because the list that is generated by len(x) for x in s.split()
converts a string, like say "Python types with ducks?"
to a list of word lengths (in my example, it would convert the string to [6, 5, 4, 6]
). That list that is generated (this is also why it’s called a generator), is what the min
function then uses to find the minimum value inside said list.
Another way to write that first example so that it works like you would expect is like this
def find_short(s):
min_length = float("inf")
for x in s.split():
if len(x) < min_length:
min_length = len(x)
return min_length
However, notice how you have to keep track of a variable that you do not have to define using the list generator method in your second example. Although this is not a big deal when you are learning programming for the first time, it becomes a bigger deal when you start making larger, more complex programs.
Sidenote:
Any value that follows the return
keyword is what a function «outputs», and thus no more code gets executed.
For example, in your first example (and assuming that the error was not generated), your loop would only ever execute once regardless of the string you give it because it does not check that you actually have found the value you want. What I mean by that is that any time your code encounters a return
statement, it means that your function is done.
That is why in my example find_short
function, I have an if
statement to check that I have the value that I want before committing to the return
statement that exits the function entirely.
0 / 0 / 0 Регистрация: 12.11.2010 Сообщений: 14 |
|
1 |
|
Найти самое короткое слово в строке28.04.2011, 19:25. Показов 31011. Ответов 4
суть задачи такова: нужно найти самое короткое слово в введённой пользователем строке и записать его в обратном порядке,то есть,например : мама -> амам. По нахождению короткого слова идеи есть,но ещё не точно. Жду помощи
0 |
1552 / 918 / 193 Регистрация: 26.03.2010 Сообщений: 3,105 |
|
28.04.2011, 19:50 |
2 |
Какие идеи у вас есть?
0 |
pntuga 0 / 0 / 0 Регистрация: 12.11.2010 Сообщений: 14 |
||||
28.04.2011, 21:28 [ТС] |
3 |
|||
Добавлено через 54 минуты
0 |
babazoya 14 / 11 / 8 Регистрация: 28.12.2010 Сообщений: 43 |
||||
28.04.2011, 23:50 |
4 |
|||
Сообщение было отмечено Памирыч как решение Решение
ks -минимальное слово
1 |
0 / 0 / 0 Регистрация: 26.05.2011 Сообщений: 3 |
|
01.06.2011, 11:02 |
5 |
нужно найти самое короткое слово в введённой пользователем строке
0 |
Дано задание: В заданной строке найти самое длинное и самое короткое слово. Вывести их на экран и вывести их длину.
Самое длинное слово выводит, самое короткое нет, не получается, за длину слов даже и не пробовал выводить. Надеюсь на помощь, уже 5-й час ломаю мозг
Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char string[200];
printf("Input a sentences: ");
gets(string);
char * pch = strtok (string," "),
* maxword = 0,
* minword = 0;
int length = strlen(pch);
int maxLen = 0;
int minLen = 1000;
while (pch != NULL)
{
length = strlen(pch);
if (maxLen < length )
{
maxLen = length;
maxword = pch;
}
pch = strtok (NULL, " ");
}
while (pch != NULL)
{
length = strlen(pch);
if (minLen > length )
{
minLen = length;
minword = pch;
}
pch = strtok (NULL, " ");
}
for(char *pch = strtok(string, " "); pch; pch = strtok(NULL, " "))
{
if(length < minLen)
{
minLen = length;
minword = pch;
strcpy(string,pch);
}
}
printf("The longest word is: %sn", maxword);
printf("The least word is: %sn", minword);
return 0;
}
`
Ainar-G
15.9k3 золотых знака24 серебряных знака41 бронзовый знак
задан 14 ноя 2019 в 22:47
У вас в коде несколько ошибок, как фактических, так и стилистических, но
ответ на ваш вопрос можно свести к тому, что вы делаете в три цикла то,
что делается в один:
for (char *word = strtok(s, delims); word != NULL;
word = strtok(NULL, delims)) {
size_t len = strlen(word);
if (len > max_len) {
max_len = len;
max_word = word;
}
if (len < min_len) {
min_len = len;
min_word = word;
}
}
Полный рабочий код:
#include <stdint.h>
// size_t
// SIZE_MAX
#include <stdio.h>
// feof
// fflush
// fgets
// perror
// printf
#include <stdlib.h>
// NULL
#include <string.h>
// strtok
// strlen
enum { SIZE = 200 };
static const char delims[] = "tnr ";
int main()
{
char s[SIZE];
printf("enter a sentence: ");
fflush(stdout);
char *res = fgets(s, SIZE, stdin);
if (!res && !feof(stdin)) {
perror("can't get the sentence");
return 1;
}
char *max_word = NULL;
char *min_word = NULL;
size_t max_len = 0;
size_t min_len = SIZE_MAX;
for (char *word = strtok(s, delims); word != NULL;
word = strtok(NULL, delims)) {
size_t len = strlen(word);
if (len > max_len) {
max_len = len;
max_word = word;
}
if (len < min_len) {
min_len = len;
min_word = word;
}
}
printf("the longest word is: %sn", max_word);
printf("the shortest word is: %sn", min_word);
return 0;
}
ответ дан 14 ноя 2019 в 23:56
Ainar-GAinar-G
15.9k3 золотых знака24 серебряных знака41 бронзовый знак
-
Не ясно, почему вы ожидаете, что это вообще может работать. После завершения первого цикла
while
(поиск длинной строки) значениеpch
будет равноNULL
. Второй циклwhile
(поиск короткой строки), разумеется, в такой ситуации будет просто пропущен. -
Как я понял, вместо того, чтобы разбираться со вторым циклом, вы написали третий цикл
for
, который пытается делать то, что не смог сделать второй циклwhile
…Но функция
strtok
является разрушающей функцией — она модифицирует исходную строку путем замены некоторых символов на. Посте такой замены исходную строку уже невозможно обрабатывать повторным проходом все тем же
strtok
.Поэтому все ваши надежды на то, что вы сможете несколько раз пройтись по словам строки через
strtok
обречены на провал.
Если вы хотите, чтобы все ваши циклы работали через strtok
, то вам придется каждому такому циклу предоставлять исходную, неповрежденную копию строки. Но лучше было бы обойтись без многочисленных проходов по строке. Для решения этой задачи одного прохода по исходной строке — более чем достаточно.
P.S. В стандартной библиотеке языка С уже давно нет функции gets
.
ответ дан 14 ноя 2019 в 23:14
Можно сделать так:
import re
s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
words = re.sub("[^w]", " ", s).split()
# если просто найти все минимальные слова
t = [v for v in words if len(v) == len(min(words))]
# если все слова надо разделить по длине
from itertools import groupby
t1 = {k:list(v) for k,v in groupby(sorted(words, key=len), len)}
print(t1[min(t1)], t)
Самое короткое слово в строке
Уровень сложности:
- Задание
- Решение
Организовать ввод строки, каждое слово в строке отделяется от других слов пробелами, их может быть неограниченное количество. Найти самое короткое слово в строке.
Для решения задачи прочитайте статью — Строки в С++. Определить символ пробела в строке можно с помощью функции isspace. Чтобы определить длину слова, воспользуйтесь функцией strlen. пример вывода программы:
Автор программы — Сергей Киях. Задача решена с использованием класса string
, собственно поэтому кода получилось так мало.
#include <iostream> #include <sstream> #include <string> int main() { std::string s; std::cout << "Enter string: "; std::getline(std::cin, s); std::stringstream ss(s); std::string word(s); while (ss >> s) if (s.size() < word.size()) word = s; std::cout << "Res: " << word << std::endl; return 0; }
Результат работы программы, показан ниже:
CppStudio.com
Enter string: Прокладывай себе дорогу силой. Res: себе
Следующие статьи помогут вам в решении данной задачи:
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.