Как получить доступ к каждой строке в списках списка - PullRequest
0 голосов
/ 27 сентября 2018

Мне было дано задание ввести несколько строк, каждая из которых состоит из нескольких слов. Задача состоит в том, чтобы прописные слова были нечетной длины, а строчные - слова одинаковой длины.Мой код теперь выглядит следующим образом, вы можете помочь мне решить его правильно?

first = []
while True:

    line = input().split()
    first.append(line)
    if len(line) < 1:
        break
for i in first:
    for j in i:
        if len(line[i][j]) % 2 == 0:
            line[i][j] = line[i][j].lower()
        elif len(line[i][j]) % 2 != 0:
            line[i][j] = line[i][j].upper()
         print(first[i])

это должно выглядеть так

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

Итак, глядя на входные данные на вашем изображении, вот лучшее решение

sentences = []
while True:
    word_list = input().split()
    sentences = [*sentences, word_list]
    if len(word_list) < 1:
        break

Так что теперь, когда у вас есть входные данные из командной строки, вы можете сделать

[word.upper() if len(word)%2 == 1 else word.lower() for word_list in sentences for word in word_list]

илиВы можете извлечь в функцию

def apply_case(word):
  if len(word)%2:
    return word.upper()
  return word.lower()

new_sentences = [apply_case(word) for word_list in sentences for word in word_list]

, теперь вы можете напечатать ее как

output = "\n".join([" ".join(word_list) for word_list in new_sentences])
print(output)
0 голосов
/ 27 сентября 2018

Вы забыли соединить линии вместе.Кроме того, с точки зрения разработки программного обеспечения , вы многое делаете во фрагменте кода: лучше инкапсулировать функции в функции, например:

def wordcase(word):
    if len(word) % 2 == 0:  # even
        return word.lower()
    else:                   # odd
        return word.upper()

Тогда мы можем дажевыполнить обработку "онлайн" (как в строке на строку):

while True:
    line = input()
    if not line:
        break
    else:
        print(' '.join(wordcase(word) for word in line.split()))
0 голосов
/ 27 сентября 2018

Не думаю, что вам нужно использовать i или j.Вы можете просто зациклить слова в вашей строке.

Далее, хотя это, вероятно, не ускорит процесс, вам не нужен elif, вы можете просто использовать else.Есть только два варианта, нечетный и четный, поэтому вам нужно проверить его только один раз.

sentance = 'I am using this as a test string with many words'

wordlist = sentance.split()
fixed_wordlist = []

for word in wordlist:
    if len(word)%2==0:
        fixed_wordlist.append(word.lower())
    else:
        fixed_wordlist.append(word.upper())

print(sentance, '\n', wordlist, '\n', fixed_wordlist)
0 голосов
/ 27 сентября 2018

i и j не являются индексами, они сами являются подсписками и словами. Вы можете сделать:

for i in first:  # i is a list of strings
    for j in range(len(i)):  # you do need the index to mutate the list
        if len(i[j]) % 2 == 0:
            i[j] = i[j].lower()
        else:
            i[j] = i[j].upper()
        print(' '.join(i))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...